In [1]:
######## snakemake preamble start (automatically inserted, do not edit) ########
import sys;sys.path.extend(['/home/aloes/miniforge3/envs/seqneut-pipeline/lib/python3.12/site-packages', '/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/seqneut-pipeline', '/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts', '/home/aloes/miniforge3/envs/seqneut-pipeline/bin', '/home/aloes/miniforge3/envs/seqneut-pipeline/lib/python3.12', '/home/aloes/miniforge3/envs/seqneut-pipeline/lib/python3.12/lib-dynload', '/home/aloes/miniforge3/envs/seqneut-pipeline/lib/python3.12/site-packages', '/home/aloes/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpt_2xtaev/file/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/seqneut-pipeline/notebooks', '/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/seqneut-pipeline/notebooks']);import pickle;from snakemake import script;script.snakemake = pickle.loads(b'\x80\x04\x95\x8f\xd0\x00\x00\x00\x00\x00\x00\x8c\x10snakemake.script\x94\x8c\tSnakemake\x94\x93\x94)\x81\x94}\x94(\x8c\x05input\x94\x8c\x0csnakemake.io\x94\x8c\nInputFiles\x94\x93\x94)\x81\x94(\x8c*results/barcode_counts/plate5_none-1_0.csv\x94\x8c*results/barcode_counts/plate5_none-2_0.csv\x94\x8c*results/barcode_counts/plate5_none-3_0.csv\x94\x8c*results/barcode_counts/plate5_none-4_0.csv\x94\x8c*results/barcode_counts/plate5_none-5_0.csv\x94\x8c*results/barcode_counts/plate5_none-6_0.csv\x94\x8c*results/barcode_counts/plate5_none-7_0.csv\x94\x8c*results/barcode_counts/plate5_none-8_0.csv\x94\x8c9results/barcode_counts/plate5_PENN23_y1964_s006_d0_40.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1964_s006_d28_40.csv\x94\x8c9results/barcode_counts/plate5_PENN23_y1977_s035_d0_40.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1977_s035_d28_40.csv\x94\x8c9results/barcode_counts/plate5_PENN23_y1987_s036_d0_40.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1987_s036_d28_40.csv\x94\x8c9results/barcode_counts/plate5_PENN23_y1996_s043_d0_40.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1996_s043_d28_40.csv\x94\x8c9results/barcode_counts/plate5_PENN23_y1964_s006_d0_80.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1964_s006_d28_80.csv\x94\x8c9results/barcode_counts/plate5_PENN23_y1977_s035_d0_80.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1977_s035_d28_80.csv\x94\x8c9results/barcode_counts/plate5_PENN23_y1987_s036_d0_80.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1987_s036_d28_80.csv\x94\x8c9results/barcode_counts/plate5_PENN23_y1996_s043_d0_80.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1996_s043_d28_80.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1964_s006_d0_160.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1964_s006_d28_160.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1977_s035_d0_160.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1977_s035_d28_160.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1987_s036_d0_160.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1987_s036_d28_160.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1996_s043_d0_160.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1996_s043_d28_160.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1964_s006_d0_320.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1964_s006_d28_320.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1977_s035_d0_320.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1977_s035_d28_320.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1987_s036_d0_320.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1987_s036_d28_320.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1996_s043_d0_320.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1996_s043_d28_320.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1964_s006_d0_640.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1964_s006_d28_640.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1977_s035_d0_640.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1977_s035_d28_640.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1987_s036_d0_640.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1987_s036_d28_640.csv\x94\x8c:results/barcode_counts/plate5_PENN23_y1996_s043_d0_640.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1996_s043_d28_640.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1964_s006_d0_1280.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1964_s006_d28_1280.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1977_s035_d0_1280.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1977_s035_d28_1280.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1987_s036_d0_1280.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1987_s036_d28_1280.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1996_s043_d0_1280.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1996_s043_d28_1280.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1964_s006_d0_2560.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1964_s006_d28_2560.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1977_s035_d0_2560.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1977_s035_d28_2560.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1987_s036_d0_2560.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1987_s036_d28_2560.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1996_s043_d0_2560.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1996_s043_d28_2560.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1964_s006_d0_5120.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1964_s006_d28_5120.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1977_s035_d0_5120.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1977_s035_d28_5120.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1987_s036_d0_5120.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1987_s036_d28_5120.csv\x94\x8c;results/barcode_counts/plate5_PENN23_y1996_s043_d0_5120.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1996_s043_d28_5120.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1964_s006_d0_10240.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1964_s006_d28_10240.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1977_s035_d0_10240.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1977_s035_d28_10240.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1987_s036_d0_10240.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1987_s036_d28_10240.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1996_s043_d0_10240.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1996_s043_d28_10240.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1964_s006_d0_20480.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1964_s006_d28_20480.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1977_s035_d0_20480.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1977_s035_d28_20480.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1987_s036_d0_20480.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1987_s036_d28_20480.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1996_s043_d0_20480.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1996_s043_d28_20480.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1964_s006_d0_40960.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1964_s006_d28_40960.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1977_s035_d0_40960.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1977_s035_d28_40960.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1987_s036_d0_40960.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1987_s036_d28_40960.csv\x94\x8c<results/barcode_counts/plate5_PENN23_y1996_s043_d0_40960.csv\x94\x8c=results/barcode_counts/plate5_PENN23_y1996_s043_d28_40960.csv\x94\x8c)results/barcode_fates/plate5_none-1_0.csv\x94\x8c)results/barcode_fates/plate5_none-2_0.csv\x94\x8c)results/barcode_fates/plate5_none-3_0.csv\x94\x8c)results/barcode_fates/plate5_none-4_0.csv\x94\x8c)results/barcode_fates/plate5_none-5_0.csv\x94\x8c)results/barcode_fates/plate5_none-6_0.csv\x94\x8c)results/barcode_fates/plate5_none-7_0.csv\x94\x8c)results/barcode_fates/plate5_none-8_0.csv\x94\x8c8results/barcode_fates/plate5_PENN23_y1964_s006_d0_40.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1964_s006_d28_40.csv\x94\x8c8results/barcode_fates/plate5_PENN23_y1977_s035_d0_40.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1977_s035_d28_40.csv\x94\x8c8results/barcode_fates/plate5_PENN23_y1987_s036_d0_40.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1987_s036_d28_40.csv\x94\x8c8results/barcode_fates/plate5_PENN23_y1996_s043_d0_40.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1996_s043_d28_40.csv\x94\x8c8results/barcode_fates/plate5_PENN23_y1964_s006_d0_80.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1964_s006_d28_80.csv\x94\x8c8results/barcode_fates/plate5_PENN23_y1977_s035_d0_80.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1977_s035_d28_80.csv\x94\x8c8results/barcode_fates/plate5_PENN23_y1987_s036_d0_80.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1987_s036_d28_80.csv\x94\x8c8results/barcode_fates/plate5_PENN23_y1996_s043_d0_80.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1996_s043_d28_80.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1964_s006_d0_160.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1964_s006_d28_160.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1977_s035_d0_160.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1977_s035_d28_160.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1987_s036_d0_160.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1987_s036_d28_160.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1996_s043_d0_160.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1996_s043_d28_160.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1964_s006_d0_320.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1964_s006_d28_320.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1977_s035_d0_320.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1977_s035_d28_320.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1987_s036_d0_320.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1987_s036_d28_320.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1996_s043_d0_320.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1996_s043_d28_320.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1964_s006_d0_640.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1964_s006_d28_640.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1977_s035_d0_640.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1977_s035_d28_640.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1987_s036_d0_640.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1987_s036_d28_640.csv\x94\x8c9results/barcode_fates/plate5_PENN23_y1996_s043_d0_640.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1996_s043_d28_640.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1964_s006_d0_1280.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1964_s006_d28_1280.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1977_s035_d0_1280.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1977_s035_d28_1280.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1987_s036_d0_1280.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1987_s036_d28_1280.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1996_s043_d0_1280.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1996_s043_d28_1280.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1964_s006_d0_2560.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1964_s006_d28_2560.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1977_s035_d0_2560.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1977_s035_d28_2560.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1987_s036_d0_2560.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1987_s036_d28_2560.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1996_s043_d0_2560.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1996_s043_d28_2560.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1964_s006_d0_5120.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1964_s006_d28_5120.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1977_s035_d0_5120.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1977_s035_d28_5120.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1987_s036_d0_5120.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1987_s036_d28_5120.csv\x94\x8c:results/barcode_fates/plate5_PENN23_y1996_s043_d0_5120.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1996_s043_d28_5120.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1964_s006_d0_10240.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1964_s006_d28_10240.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1977_s035_d0_10240.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1977_s035_d28_10240.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1987_s036_d0_10240.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1987_s036_d28_10240.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1996_s043_d0_10240.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1996_s043_d28_10240.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1964_s006_d0_20480.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1964_s006_d28_20480.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1977_s035_d0_20480.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1977_s035_d28_20480.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1987_s036_d0_20480.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1987_s036_d28_20480.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1996_s043_d0_20480.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1996_s043_d28_20480.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1964_s006_d0_40960.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1964_s006_d28_40960.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1977_s035_d0_40960.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1977_s035_d28_40960.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1987_s036_d0_40960.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1987_s036_d28_40960.csv\x94\x8c;results/barcode_fates/plate5_PENN23_y1996_s043_d0_40960.csv\x94\x8c<results/barcode_fates/plate5_PENN23_y1996_s043_d28_40960.csv\x94\x8c*data/viral_libraries/H1N1_2023_library.csv\x94\x8c3data/neut_standard_sets/loes2023_neut_standards.csv\x94e}\x94(\x8c\x06_names\x94}\x94(\x8c\ncount_csvs\x94K\x00K`\x86\x94\x8c\tfate_csvs\x94K`K\xc0\x86\x94\x8c\x11viral_library_csv\x94K\xc0N\x86\x94\x8c\x15neut_standard_set_csv\x94K\xc1N\x86\x94u\x8c\x12_allowed_overrides\x94]\x94(\x8c\x05index\x94\x8c\x04sort\x94eh\xd9h\x06\x8c\x0eAttributeGuard\x94\x93\x94)\x81\x94}\x94\x8c\x04name\x94h\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbh\xcfh\x06\x8c\tNamedlist\x94\x93\x94)\x81\x94(h\nh\x0bh\x0ch\rh\x0eh\x0fh\x10h\x11h\x12h\x13h\x14h\x15h\x16h\x17h\x18h\x19h\x1ah\x1bh\x1ch\x1dh\x1eh\x1fh h!h"h#h$h%h&h\'h(h)h*h+h,h-h.h/h0h1h2h3h4h5h6h7h8h9h:h;h<h=h>h?h@hAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh[h\\h]h^h_h`hahbhchdhehfhghhhie}\x94(h\xcd}\x94h\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbubh\xd1h\xe3)\x81\x94(hjhkhlhmhnhohphqhrhshthuhvhwhxhyhzh{h|h}h~h\x7fh\x80h\x81h\x82h\x83h\x84h\x85h\x86h\x87h\x88h\x89h\x8ah\x8bh\x8ch\x8dh\x8eh\x8fh\x90h\x91h\x92h\x93h\x94h\x95h\x96h\x97h\x98h\x99h\x9ah\x9bh\x9ch\x9dh\x9eh\x9fh\xa0h\xa1h\xa2h\xa3h\xa4h\xa5h\xa6h\xa7h\xa8h\xa9h\xaah\xabh\xach\xadh\xaeh\xafh\xb0h\xb1h\xb2h\xb3h\xb4h\xb5h\xb6h\xb7h\xb8h\xb9h\xbah\xbbh\xbch\xbdh\xbeh\xbfh\xc0h\xc1h\xc2h\xc3h\xc4h\xc5h\xc6h\xc7h\xc8h\xc9e}\x94(h\xcd}\x94h\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbubh\xd3h\xcah\xd5h\xcbub\x8c\x06output\x94h\x06\x8c\x0bOutputFiles\x94\x93\x94)\x81\x94(\x8c"results/plates/plate5/qc_drops.yml\x94\x8c*results/plates/plate5/frac_infectivity.csv\x94\x8c#results/plates/plate5/curvefits.csv\x94\x8c&results/plates/plate5/curvefits.pickle\x94e}\x94(h\xcd}\x94(\x8c\x08qc_drops\x94K\x00N\x86\x94\x8c\x14frac_infectivity_csv\x94K\x01N\x86\x94\x8c\x08fits_csv\x94K\x02N\x86\x94\x8c\x0bfits_pickle\x94K\x03N\x86\x94uh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbh\xfeh\xf8j\x00\x01\x00\x00h\xf9j\x02\x01\x00\x00h\xfaj\x04\x01\x00\x00h\xfbub\x8c\x06params\x94h\x06\x8c\x06Params\x94\x93\x94)\x81\x94(]\x94(\x8c\x0fplate5_none-1_0\x94\x8c\x0fplate5_none-2_0\x94\x8c\x0fplate5_none-3_0\x94\x8c\x0fplate5_none-4_0\x94\x8c\x0fplate5_none-5_0\x94\x8c\x0fplate5_none-6_0\x94\x8c\x0fplate5_none-7_0\x94\x8c\x0fplate5_none-8_0\x94\x8c\x1eplate5_PENN23_y1964_s006_d0_40\x94\x8c\x1fplate5_PENN23_y1964_s006_d28_40\x94\x8c\x1eplate5_PENN23_y1977_s035_d0_40\x94\x8c\x1fplate5_PENN23_y1977_s035_d28_40\x94\x8c\x1eplate5_PENN23_y1987_s036_d0_40\x94\x8c\x1fplate5_PENN23_y1987_s036_d28_40\x94\x8c\x1eplate5_PENN23_y1996_s043_d0_40\x94\x8c\x1fplate5_PENN23_y1996_s043_d28_40\x94\x8c\x1eplate5_PENN23_y1964_s006_d0_80\x94\x8c\x1fplate5_PENN23_y1964_s006_d28_80\x94\x8c\x1eplate5_PENN23_y1977_s035_d0_80\x94\x8c\x1fplate5_PENN23_y1977_s035_d28_80\x94\x8c\x1eplate5_PENN23_y1987_s036_d0_80\x94\x8c\x1fplate5_PENN23_y1987_s036_d28_80\x94\x8c\x1eplate5_PENN23_y1996_s043_d0_80\x94\x8c\x1fplate5_PENN23_y1996_s043_d28_80\x94\x8c\x1fplate5_PENN23_y1964_s006_d0_160\x94\x8c plate5_PENN23_y1964_s006_d28_160\x94\x8c\x1fplate5_PENN23_y1977_s035_d0_160\x94\x8c plate5_PENN23_y1977_s035_d28_160\x94\x8c\x1fplate5_PENN23_y1987_s036_d0_160\x94\x8c plate5_PENN23_y1987_s036_d28_160\x94\x8c\x1fplate5_PENN23_y1996_s043_d0_160\x94\x8c plate5_PENN23_y1996_s043_d28_160\x94\x8c\x1fplate5_PENN23_y1964_s006_d0_320\x94\x8c plate5_PENN23_y1964_s006_d28_320\x94\x8c\x1fplate5_PENN23_y1977_s035_d0_320\x94\x8c plate5_PENN23_y1977_s035_d28_320\x94\x8c\x1fplate5_PENN23_y1987_s036_d0_320\x94\x8c plate5_PENN23_y1987_s036_d28_320\x94\x8c\x1fplate5_PENN23_y1996_s043_d0_320\x94\x8c plate5_PENN23_y1996_s043_d28_320\x94\x8c\x1fplate5_PENN23_y1964_s006_d0_640\x94\x8c plate5_PENN23_y1964_s006_d28_640\x94\x8c\x1fplate5_PENN23_y1977_s035_d0_640\x94\x8c plate5_PENN23_y1977_s035_d28_640\x94\x8c\x1fplate5_PENN23_y1987_s036_d0_640\x94\x8c plate5_PENN23_y1987_s036_d28_640\x94\x8c\x1fplate5_PENN23_y1996_s043_d0_640\x94\x8c plate5_PENN23_y1996_s043_d28_640\x94\x8c plate5_PENN23_y1964_s006_d0_1280\x94\x8c!plate5_PENN23_y1964_s006_d28_1280\x94\x8c plate5_PENN23_y1977_s035_d0_1280\x94\x8c!plate5_PENN23_y1977_s035_d28_1280\x94\x8c plate5_PENN23_y1987_s036_d0_1280\x94\x8c!plate5_PENN23_y1987_s036_d28_1280\x94\x8c plate5_PENN23_y1996_s043_d0_1280\x94\x8c!plate5_PENN23_y1996_s043_d28_1280\x94\x8c plate5_PENN23_y1964_s006_d0_2560\x94\x8c!plate5_PENN23_y1964_s006_d28_2560\x94\x8c plate5_PENN23_y1977_s035_d0_2560\x94\x8c!plate5_PENN23_y1977_s035_d28_2560\x94\x8c plate5_PENN23_y1987_s036_d0_2560\x94\x8c!plate5_PENN23_y1987_s036_d28_2560\x94\x8c plate5_PENN23_y1996_s043_d0_2560\x94\x8c!plate5_PENN23_y1996_s043_d28_2560\x94\x8c plate5_PENN23_y1964_s006_d0_5120\x94\x8c!plate5_PENN23_y1964_s006_d28_5120\x94\x8c plate5_PENN23_y1977_s035_d0_5120\x94\x8c!plate5_PENN23_y1977_s035_d28_5120\x94\x8c plate5_PENN23_y1987_s036_d0_5120\x94\x8c!plate5_PENN23_y1987_s036_d28_5120\x94\x8c plate5_PENN23_y1996_s043_d0_5120\x94\x8c!plate5_PENN23_y1996_s043_d28_5120\x94\x8c!plate5_PENN23_y1964_s006_d0_10240\x94\x8c"plate5_PENN23_y1964_s006_d28_10240\x94\x8c!plate5_PENN23_y1977_s035_d0_10240\x94\x8c"plate5_PENN23_y1977_s035_d28_10240\x94\x8c!plate5_PENN23_y1987_s036_d0_10240\x94\x8c"plate5_PENN23_y1987_s036_d28_10240\x94\x8c!plate5_PENN23_y1996_s043_d0_10240\x94\x8c"plate5_PENN23_y1996_s043_d28_10240\x94\x8c!plate5_PENN23_y1964_s006_d0_20480\x94\x8c"plate5_PENN23_y1964_s006_d28_20480\x94\x8c!plate5_PENN23_y1977_s035_d0_20480\x94\x8c"plate5_PENN23_y1977_s035_d28_20480\x94\x8c!plate5_PENN23_y1987_s036_d0_20480\x94\x8c"plate5_PENN23_y1987_s036_d28_20480\x94\x8c!plate5_PENN23_y1996_s043_d0_20480\x94\x8c"plate5_PENN23_y1996_s043_d28_20480\x94\x8c!plate5_PENN23_y1964_s006_d0_40960\x94\x8c"plate5_PENN23_y1964_s006_d28_40960\x94\x8c!plate5_PENN23_y1977_s035_d0_40960\x94\x8c"plate5_PENN23_y1977_s035_d28_40960\x94\x8c!plate5_PENN23_y1987_s036_d0_40960\x94\x8c"plate5_PENN23_y1987_s036_d28_40960\x94\x8c!plate5_PENN23_y1996_s043_d0_40960\x94\x8c"plate5_PENN23_y1996_s043_d28_40960\x94e}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94\x8c\n2024-06-20\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate9_RT_Penn7.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x10serum_replicates\x94]\x94(\x8c\x14PENN23_y1964_s006_d0\x94\x8c\x15PENN23_y1964_s006_d28\x94es\x8c\rqc_thresholds\x94}\x94(\x8c\x1bavg_barcode_counts_per_well\x94M\xf4\x01\x8c\x1fmin_neut_standard_frac_per_well\x94G?tz\xe1G\xae\x14{\x8c"no_serum_per_viral_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?\x04\xf8\xb5\x88\xe3h\xf1\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c!per_neut_standard_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?*6\xe2\xeb\x1cC-\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c min_neut_standard_count_per_well\x94M\xf4\x01\x8c)min_no_serum_count_per_viral_barcode_well\x94K2\x8c+max_frac_infectivity_per_viral_barcode_well\x94K\x04\x8c)min_dilutions_per_barcode_serum_replicate\x94K\x05u\x8c\x0fcurvefit_params\x94}\x94(\x8c\x18frac_infectivity_ceiling\x94K\x01\x8c\x06fixtop\x94]\x94(G?\xe3333333K\x01e\x8c\tfixbottom\x94K\x00\x8c\x08fixslope\x94]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c\x0bcurvefit_qc\x94}\x94(\x8c\x1dmax_frac_infectivity_at_least\x94K\x00\x8c\x0fgoodness_of_fit\x94}\x94(\x8c\x06min_R2\x94G?\xe6ffffff\x8c\x08max_RMSD\x94G?\xd0\x00\x00\x00\x00\x00\x00u\x8c#serum_replicates_ignore_curvefit_qc\x94]\x94\x8c+barcode_serum_replicates_ignore_curvefit_qc\x94]\x94u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\x08upstream\x94\x8c\x1cCCTACAATGTCGGATTTGTATTTAATAG\x94\x8c\ndownstream\x94\x8c\x00\x94\x8c\x04minq\x94K\x14\x8c\x11upstream_mismatch\x94K\x04\x8c\x0ebc_orientation\x94\x8c\x02R2\x94\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01u\x8c\x07samples\x94}\x94(\x8c\x04well\x94}\x94(K\x00\x8c\x02H1\x94K\x01\x8c\x02G1\x94K\x02\x8c\x02F1\x94K\x03\x8c\x02E1\x94K\x04\x8c\x02D1\x94K\x05\x8c\x02C1\x94K\x06\x8c\x02B1\x94K\x07\x8c\x02A1\x94K\x08\x8c\x02H2\x94K\t\x8c\x02G2\x94K\n\x8c\x02F2\x94K\x0b\x8c\x02E2\x94K\x0c\x8c\x02D2\x94K\r\x8c\x02C2\x94K\x0e\x8c\x02B2\x94K\x0f\x8c\x02A2\x94K\x10\x8c\x02H3\x94K\x11\x8c\x02G3\x94K\x12\x8c\x02F3\x94K\x13\x8c\x02E3\x94K\x14\x8c\x02D3\x94K\x15\x8c\x02C3\x94K\x16\x8c\x02B3\x94K\x17\x8c\x02A3\x94K\x18\x8c\x02H4\x94K\x19\x8c\x02G4\x94K\x1a\x8c\x02F4\x94K\x1b\x8c\x02E4\x94K\x1c\x8c\x02D4\x94K\x1d\x8c\x02C4\x94K\x1e\x8c\x02B4\x94K\x1f\x8c\x02A4\x94K \x8c\x02H5\x94K!\x8c\x02G5\x94K"\x8c\x02F5\x94K#\x8c\x02E5\x94K$\x8c\x02D5\x94K%\x8c\x02C5\x94K&\x8c\x02B5\x94K\'\x8c\x02A5\x94K(\x8c\x02H6\x94K)\x8c\x02G6\x94K*\x8c\x02F6\x94K+\x8c\x02E6\x94K,\x8c\x02D6\x94K-\x8c\x02C6\x94K.\x8c\x02B6\x94K/\x8c\x02A6\x94K0\x8c\x02H7\x94K1\x8c\x02G7\x94K2\x8c\x02F7\x94K3\x8c\x02E7\x94K4\x8c\x02D7\x94K5\x8c\x02C7\x94K6\x8c\x02B7\x94K7\x8c\x02A7\x94K8\x8c\x02H8\x94K9\x8c\x02G8\x94K:\x8c\x02F8\x94K;\x8c\x02E8\x94K<\x8c\x02D8\x94K=\x8c\x02C8\x94K>\x8c\x02B8\x94K?\x8c\x02A8\x94K@\x8c\x02H9\x94KA\x8c\x02G9\x94KB\x8c\x02F9\x94KC\x8c\x02E9\x94KD\x8c\x02D9\x94KE\x8c\x02C9\x94KF\x8c\x02B9\x94KG\x8c\x02A9\x94KH\x8c\x03H10\x94KI\x8c\x03G10\x94KJ\x8c\x03F10\x94KK\x8c\x03E10\x94KL\x8c\x03D10\x94KM\x8c\x03C10\x94KN\x8c\x03B10\x94KO\x8c\x03A10\x94KP\x8c\x03H11\x94KQ\x8c\x03G11\x94KR\x8c\x03F11\x94KS\x8c\x03E11\x94KT\x8c\x03D11\x94KU\x8c\x03C11\x94KV\x8c\x03B11\x94KW\x8c\x03A11\x94KX\x8c\x03H12\x94KY\x8c\x03G12\x94KZ\x8c\x03F12\x94K[\x8c\x03E12\x94K\\\x8c\x03D12\x94K]\x8c\x03C12\x94K^\x8c\x03B12\x94K_\x8c\x03A12\x94u\x8c\x05serum\x94}\x94(K\x00\x8c\x04none\x94K\x01j\x19\x02\x00\x00K\x02j\x19\x02\x00\x00K\x03j\x19\x02\x00\x00K\x04j\x19\x02\x00\x00K\x05j\x19\x02\x00\x00K\x06j\x19\x02\x00\x00K\x07j\x19\x02\x00\x00K\x08\x8c\x14PENN23_y1964_s006_d0\x94K\t\x8c\x15PENN23_y1964_s006_d28\x94K\n\x8c\x14PENN23_y1977_s035_d0\x94K\x0b\x8c\x15PENN23_y1977_s035_d28\x94K\x0c\x8c\x14PENN23_y1987_s036_d0\x94K\r\x8c\x15PENN23_y1987_s036_d28\x94K\x0e\x8c\x14PENN23_y1996_s043_d0\x94K\x0f\x8c\x15PENN23_y1996_s043_d28\x94K\x10j\x1a\x02\x00\x00K\x11j\x1b\x02\x00\x00K\x12j\x1c\x02\x00\x00K\x13j\x1d\x02\x00\x00K\x14j\x1e\x02\x00\x00K\x15j\x1f\x02\x00\x00K\x16j \x02\x00\x00K\x17j!\x02\x00\x00K\x18j\x1a\x02\x00\x00K\x19j\x1b\x02\x00\x00K\x1aj\x1c\x02\x00\x00K\x1bj\x1d\x02\x00\x00K\x1cj\x1e\x02\x00\x00K\x1dj\x1f\x02\x00\x00K\x1ej \x02\x00\x00K\x1fj!\x02\x00\x00K j\x1a\x02\x00\x00K!j\x1b\x02\x00\x00K"j\x1c\x02\x00\x00K#j\x1d\x02\x00\x00K$j\x1e\x02\x00\x00K%j\x1f\x02\x00\x00K&j \x02\x00\x00K\'j!\x02\x00\x00K(j\x1a\x02\x00\x00K)j\x1b\x02\x00\x00K*j\x1c\x02\x00\x00K+j\x1d\x02\x00\x00K,j\x1e\x02\x00\x00K-j\x1f\x02\x00\x00K.j \x02\x00\x00K/j!\x02\x00\x00K0j\x1a\x02\x00\x00K1j\x1b\x02\x00\x00K2j\x1c\x02\x00\x00K3j\x1d\x02\x00\x00K4j\x1e\x02\x00\x00K5j\x1f\x02\x00\x00K6j \x02\x00\x00K7j!\x02\x00\x00K8j\x1a\x02\x00\x00K9j\x1b\x02\x00\x00K:j\x1c\x02\x00\x00K;j\x1d\x02\x00\x00K<j\x1e\x02\x00\x00K=j\x1f\x02\x00\x00K>j \x02\x00\x00K?j!\x02\x00\x00K@j\x1a\x02\x00\x00KAj\x1b\x02\x00\x00KBj\x1c\x02\x00\x00KCj\x1d\x02\x00\x00KDj\x1e\x02\x00\x00KEj\x1f\x02\x00\x00KFj \x02\x00\x00KGj!\x02\x00\x00KHj\x1a\x02\x00\x00KIj\x1b\x02\x00\x00KJj\x1c\x02\x00\x00KKj\x1d\x02\x00\x00KLj\x1e\x02\x00\x00KMj\x1f\x02\x00\x00KNj \x02\x00\x00KOj!\x02\x00\x00KPj\x1a\x02\x00\x00KQj\x1b\x02\x00\x00KRj\x1c\x02\x00\x00KSj\x1d\x02\x00\x00KTj\x1e\x02\x00\x00KUj\x1f\x02\x00\x00KVj \x02\x00\x00KWj!\x02\x00\x00KXj\x1a\x02\x00\x00KYj\x1b\x02\x00\x00KZj\x1c\x02\x00\x00K[j\x1d\x02\x00\x00K\\j\x1e\x02\x00\x00K]j\x1f\x02\x00\x00K^j \x02\x00\x00K_j!\x02\x00\x00u\x8c\x0fdilution_factor\x94}\x94(K\x00K\x00K\x01K\x00K\x02K\x00K\x03K\x00K\x04K\x00K\x05K\x00K\x06K\x00K\x07K\x00K\x08K(K\tK(K\nK(K\x0bK(K\x0cK(K\rK(K\x0eK(K\x0fK(K\x10KPK\x11KPK\x12KPK\x13KPK\x14KPK\x15KPK\x16KPK\x17KPK\x18K\xa0K\x19K\xa0K\x1aK\xa0K\x1bK\xa0K\x1cK\xa0K\x1dK\xa0K\x1eK\xa0K\x1fK\xa0K M@\x01K!M@\x01K"M@\x01K#M@\x01K$M@\x01K%M@\x01K&M@\x01K\'M@\x01K(M\x80\x02K)M\x80\x02K*M\x80\x02K+M\x80\x02K,M\x80\x02K-M\x80\x02K.M\x80\x02K/M\x80\x02K0M\x00\x05K1M\x00\x05K2M\x00\x05K3M\x00\x05K4M\x00\x05K5M\x00\x05K6M\x00\x05K7M\x00\x05K8M\x00\nK9M\x00\nK:M\x00\nK;M\x00\nK<M\x00\nK=M\x00\nK>M\x00\nK?M\x00\nK@M\x00\x14KAM\x00\x14KBM\x00\x14KCM\x00\x14KDM\x00\x14KEM\x00\x14KFM\x00\x14KGM\x00\x14KHM\x00(KIM\x00(KJM\x00(KKM\x00(KLM\x00(KMM\x00(KNM\x00(KOM\x00(KPM\x00PKQM\x00PKRM\x00PKSM\x00PKTM\x00PKUM\x00PKVM\x00PKWM\x00PKXM\x00\xa0KYM\x00\xa0KZM\x00\xa0K[M\x00\xa0K\\M\x00\xa0K]M\x00\xa0K^M\x00\xa0K_M\x00\xa0u\x8c\treplicate\x94}\x94(K\x00K\x01K\x01K\x02K\x02K\x03K\x03K\x04K\x04K\x05K\x05K\x06K\x06K\x07K\x07K\x08K\x08K\x01K\tK\x01K\nK\x01K\x0bK\x01K\x0cK\x01K\rK\x01K\x0eK\x01K\x0fK\x01K\x10K\x01K\x11K\x01K\x12K\x01K\x13K\x01K\x14K\x01K\x15K\x01K\x16K\x01K\x17K\x01K\x18K\x01K\x19K\x01K\x1aK\x01K\x1bK\x01K\x1cK\x01K\x1dK\x01K\x1eK\x01K\x1fK\x01K K\x01K!K\x01K"K\x01K#K\x01K$K\x01K%K\x01K&K\x01K\'K\x01K(K\x01K)K\x01K*K\x01K+K\x01K,K\x01K-K\x01K.K\x01K/K\x01K0K\x01K1K\x01K2K\x01K3K\x01K4K\x01K5K\x01K6K\x01K7K\x01K8K\x01K9K\x01K:K\x01K;K\x01K<K\x01K=K\x01K>K\x01K?K\x01K@K\x01KAK\x01KBK\x01KCK\x01KDK\x01KEK\x01KFK\x01KGK\x01KHK\x01KIK\x01KJK\x01KKK\x01KLK\x01KMK\x01KNK\x01KOK\x01KPK\x01KQK\x01KRK\x01KSK\x01KTK\x01KUK\x01KVK\x01KWK\x01KXK\x01KYK\x01KZK\x01K[K\x01K\\K\x01K]K\x01K^K\x01K_K\x01u\x8c\x05fastq\x94}\x94(K\x00\x8cx/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_1_S97_R1_001.fastq.gz\x94K\x01\x8cx/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_2_S98_R1_001.fastq.gz\x94K\x02\x8cx/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_3_S99_R1_001.fastq.gz\x94K\x03\x8cy/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_4_S100_R1_001.fastq.gz\x94K\x04\x8cy/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_5_S101_R1_001.fastq.gz\x94K\x05\x8cy/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_6_S102_R1_001.fastq.gz\x94K\x06\x8cy/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_7_S103_R1_001.fastq.gz\x94K\x07\x8cy/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_8_S104_R1_001.fastq.gz\x94K\x08\x8cy/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_9_S105_R1_001.fastq.gz\x94K\t\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_10_S106_R1_001.fastq.gz\x94K\n\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_11_S107_R1_001.fastq.gz\x94K\x0b\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_12_S108_R1_001.fastq.gz\x94K\x0c\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_13_S109_R1_001.fastq.gz\x94K\r\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_14_S110_R1_001.fastq.gz\x94K\x0e\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_15_S111_R1_001.fastq.gz\x94K\x0f\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_16_S112_R1_001.fastq.gz\x94K\x10\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_17_S113_R1_001.fastq.gz\x94K\x11\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_18_S114_R1_001.fastq.gz\x94K\x12\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_19_S115_R1_001.fastq.gz\x94K\x13\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_20_S116_R1_001.fastq.gz\x94K\x14\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_21_S117_R1_001.fastq.gz\x94K\x15\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_22_S118_R1_001.fastq.gz\x94K\x16\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_23_S119_R1_001.fastq.gz\x94K\x17\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_24_S120_R1_001.fastq.gz\x94K\x18\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_25_S121_R1_001.fastq.gz\x94K\x19\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_26_S122_R1_001.fastq.gz\x94K\x1a\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_27_S123_R1_001.fastq.gz\x94K\x1b\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_28_S124_R1_001.fastq.gz\x94K\x1c\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_29_S125_R1_001.fastq.gz\x94K\x1d\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_30_S126_R1_001.fastq.gz\x94K\x1e\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_31_S127_R1_001.fastq.gz\x94K\x1f\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_32_S128_R1_001.fastq.gz\x94K \x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_33_S129_R1_001.fastq.gz\x94K!\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_34_S130_R1_001.fastq.gz\x94K"\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_35_S131_R1_001.fastq.gz\x94K#\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_36_S132_R1_001.fastq.gz\x94K$\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_37_S133_R1_001.fastq.gz\x94K%\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_38_S134_R1_001.fastq.gz\x94K&\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_39_S135_R1_001.fastq.gz\x94K\'\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_40_S136_R1_001.fastq.gz\x94K(\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_41_S137_R1_001.fastq.gz\x94K)\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_42_S138_R1_001.fastq.gz\x94K*\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_43_S139_R1_001.fastq.gz\x94K+\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_44_S140_R1_001.fastq.gz\x94K,\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_45_S141_R1_001.fastq.gz\x94K-\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_46_S142_R1_001.fastq.gz\x94K.\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_47_S143_R1_001.fastq.gz\x94K/\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_48_S144_R1_001.fastq.gz\x94K0\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_49_S145_R1_001.fastq.gz\x94K1\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_50_S146_R1_001.fastq.gz\x94K2\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_51_S147_R1_001.fastq.gz\x94K3\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_52_S148_R1_001.fastq.gz\x94K4\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_53_S149_R1_001.fastq.gz\x94K5\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_54_S150_R1_001.fastq.gz\x94K6\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_55_S151_R1_001.fastq.gz\x94K7\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_56_S152_R1_001.fastq.gz\x94K8\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_57_S153_R1_001.fastq.gz\x94K9\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_58_S154_R1_001.fastq.gz\x94K:\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_59_S155_R1_001.fastq.gz\x94K;\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_60_S156_R1_001.fastq.gz\x94K<\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_61_S157_R1_001.fastq.gz\x94K=\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_62_S158_R1_001.fastq.gz\x94K>\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_63_S159_R1_001.fastq.gz\x94K?\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_64_S160_R1_001.fastq.gz\x94K@\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_65_S161_R1_001.fastq.gz\x94KA\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_66_S162_R1_001.fastq.gz\x94KB\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_67_S163_R1_001.fastq.gz\x94KC\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_68_S164_R1_001.fastq.gz\x94KD\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_69_S165_R1_001.fastq.gz\x94KE\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_70_S166_R1_001.fastq.gz\x94KF\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_71_S167_R1_001.fastq.gz\x94KG\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_72_S168_R1_001.fastq.gz\x94KH\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_73_S169_R1_001.fastq.gz\x94KI\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_74_S170_R1_001.fastq.gz\x94KJ\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_75_S171_R1_001.fastq.gz\x94KK\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_76_S172_R1_001.fastq.gz\x94KL\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_77_S173_R1_001.fastq.gz\x94KM\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_78_S174_R1_001.fastq.gz\x94KN\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_79_S175_R1_001.fastq.gz\x94KO\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_80_S176_R1_001.fastq.gz\x94KP\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_81_S177_R1_001.fastq.gz\x94KQ\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_82_S178_R1_001.fastq.gz\x94KR\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_83_S179_R1_001.fastq.gz\x94KS\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_84_S180_R1_001.fastq.gz\x94KT\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_85_S181_R1_001.fastq.gz\x94KU\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_86_S182_R1_001.fastq.gz\x94KV\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_87_S183_R1_001.fastq.gz\x94KW\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_88_S184_R1_001.fastq.gz\x94KX\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_89_S185_R1_001.fastq.gz\x94KY\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_90_S186_R1_001.fastq.gz\x94KZ\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_91_S187_R1_001.fastq.gz\x94K[\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_92_S188_R1_001.fastq.gz\x94K\\\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_93_S189_R1_001.fastq.gz\x94K]\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_94_S190_R1_001.fastq.gz\x94K^\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_95_S191_R1_001.fastq.gz\x94K_\x8cz/fh/fast/bloom_j/SR/ngs/illumina/aloes/240620_VH01189_298_AAFT32LM5/Unaligned/Project_aloes/PlateB_96_S192_R1_001.fastq.gz\x94u\x8c\x0fserum_replicate\x94}\x94(K\x00\x8c\x06none-1\x94K\x01\x8c\x06none-2\x94K\x02\x8c\x06none-3\x94K\x03\x8c\x06none-4\x94K\x04\x8c\x06none-5\x94K\x05\x8c\x06none-6\x94K\x06\x8c\x06none-7\x94K\x07\x8c\x06none-8\x94K\x08j\x1a\x02\x00\x00K\tj\x1b\x02\x00\x00K\nj\x1c\x02\x00\x00K\x0bj\x1d\x02\x00\x00K\x0cj\x1e\x02\x00\x00K\rj\x1f\x02\x00\x00K\x0ej \x02\x00\x00K\x0fj!\x02\x00\x00K\x10j\x1a\x02\x00\x00K\x11j\x1b\x02\x00\x00K\x12j\x1c\x02\x00\x00K\x13j\x1d\x02\x00\x00K\x14j\x1e\x02\x00\x00K\x15j\x1f\x02\x00\x00K\x16j \x02\x00\x00K\x17j!\x02\x00\x00K\x18j\x1a\x02\x00\x00K\x19j\x1b\x02\x00\x00K\x1aj\x1c\x02\x00\x00K\x1bj\x1d\x02\x00\x00K\x1cj\x1e\x02\x00\x00K\x1dj\x1f\x02\x00\x00K\x1ej \x02\x00\x00K\x1fj!\x02\x00\x00K j\x1a\x02\x00\x00K!j\x1b\x02\x00\x00K"j\x1c\x02\x00\x00K#j\x1d\x02\x00\x00K$j\x1e\x02\x00\x00K%j\x1f\x02\x00\x00K&j \x02\x00\x00K\'j!\x02\x00\x00K(j\x1a\x02\x00\x00K)j\x1b\x02\x00\x00K*j\x1c\x02\x00\x00K+j\x1d\x02\x00\x00K,j\x1e\x02\x00\x00K-j\x1f\x02\x00\x00K.j \x02\x00\x00K/j!\x02\x00\x00K0j\x1a\x02\x00\x00K1j\x1b\x02\x00\x00K2j\x1c\x02\x00\x00K3j\x1d\x02\x00\x00K4j\x1e\x02\x00\x00K5j\x1f\x02\x00\x00K6j \x02\x00\x00K7j!\x02\x00\x00K8j\x1a\x02\x00\x00K9j\x1b\x02\x00\x00K:j\x1c\x02\x00\x00K;j\x1d\x02\x00\x00K<j\x1e\x02\x00\x00K=j\x1f\x02\x00\x00K>j \x02\x00\x00K?j!\x02\x00\x00K@j\x1a\x02\x00\x00KAj\x1b\x02\x00\x00KBj\x1c\x02\x00\x00KCj\x1d\x02\x00\x00KDj\x1e\x02\x00\x00KEj\x1f\x02\x00\x00KFj \x02\x00\x00KGj!\x02\x00\x00KHj\x1a\x02\x00\x00KIj\x1b\x02\x00\x00KJj\x1c\x02\x00\x00KKj\x1d\x02\x00\x00KLj\x1e\x02\x00\x00KMj\x1f\x02\x00\x00KNj \x02\x00\x00KOj!\x02\x00\x00KPj\x1a\x02\x00\x00KQj\x1b\x02\x00\x00KRj\x1c\x02\x00\x00KSj\x1d\x02\x00\x00KTj\x1e\x02\x00\x00KUj\x1f\x02\x00\x00KVj \x02\x00\x00KWj!\x02\x00\x00KXj\x1a\x02\x00\x00KYj\x1b\x02\x00\x00KZj\x1c\x02\x00\x00K[j\x1d\x02\x00\x00K\\j\x1e\x02\x00\x00K]j\x1f\x02\x00\x00K^j \x02\x00\x00K_j!\x02\x00\x00u\x8c\x0esample_noplate\x94}\x94(K\x00\x8c\x08none-1_0\x94K\x01\x8c\x08none-2_0\x94K\x02\x8c\x08none-3_0\x94K\x03\x8c\x08none-4_0\x94K\x04\x8c\x08none-5_0\x94K\x05\x8c\x08none-6_0\x94K\x06\x8c\x08none-7_0\x94K\x07\x8c\x08none-8_0\x94K\x08\x8c\x17PENN23_y1964_s006_d0_40\x94K\t\x8c\x18PENN23_y1964_s006_d28_40\x94K\n\x8c\x17PENN23_y1977_s035_d0_40\x94K\x0b\x8c\x18PENN23_y1977_s035_d28_40\x94K\x0c\x8c\x17PENN23_y1987_s036_d0_40\x94K\r\x8c\x18PENN23_y1987_s036_d28_40\x94K\x0e\x8c\x17PENN23_y1996_s043_d0_40\x94K\x0f\x8c\x18PENN23_y1996_s043_d28_40\x94K\x10\x8c\x17PENN23_y1964_s006_d0_80\x94K\x11\x8c\x18PENN23_y1964_s006_d28_80\x94K\x12\x8c\x17PENN23_y1977_s035_d0_80\x94K\x13\x8c\x18PENN23_y1977_s035_d28_80\x94K\x14\x8c\x17PENN23_y1987_s036_d0_80\x94K\x15\x8c\x18PENN23_y1987_s036_d28_80\x94K\x16\x8c\x17PENN23_y1996_s043_d0_80\x94K\x17\x8c\x18PENN23_y1996_s043_d28_80\x94K\x18\x8c\x18PENN23_y1964_s006_d0_160\x94K\x19\x8c\x19PENN23_y1964_s006_d28_160\x94K\x1a\x8c\x18PENN23_y1977_s035_d0_160\x94K\x1b\x8c\x19PENN23_y1977_s035_d28_160\x94K\x1c\x8c\x18PENN23_y1987_s036_d0_160\x94K\x1d\x8c\x19PENN23_y1987_s036_d28_160\x94K\x1e\x8c\x18PENN23_y1996_s043_d0_160\x94K\x1f\x8c\x19PENN23_y1996_s043_d28_160\x94K \x8c\x18PENN23_y1964_s006_d0_320\x94K!\x8c\x19PENN23_y1964_s006_d28_320\x94K"\x8c\x18PENN23_y1977_s035_d0_320\x94K#\x8c\x19PENN23_y1977_s035_d28_320\x94K$\x8c\x18PENN23_y1987_s036_d0_320\x94K%\x8c\x19PENN23_y1987_s036_d28_320\x94K&\x8c\x18PENN23_y1996_s043_d0_320\x94K\'\x8c\x19PENN23_y1996_s043_d28_320\x94K(\x8c\x18PENN23_y1964_s006_d0_640\x94K)\x8c\x19PENN23_y1964_s006_d28_640\x94K*\x8c\x18PENN23_y1977_s035_d0_640\x94K+\x8c\x19PENN23_y1977_s035_d28_640\x94K,\x8c\x18PENN23_y1987_s036_d0_640\x94K-\x8c\x19PENN23_y1987_s036_d28_640\x94K.\x8c\x18PENN23_y1996_s043_d0_640\x94K/\x8c\x19PENN23_y1996_s043_d28_640\x94K0\x8c\x19PENN23_y1964_s006_d0_1280\x94K1\x8c\x1aPENN23_y1964_s006_d28_1280\x94K2\x8c\x19PENN23_y1977_s035_d0_1280\x94K3\x8c\x1aPENN23_y1977_s035_d28_1280\x94K4\x8c\x19PENN23_y1987_s036_d0_1280\x94K5\x8c\x1aPENN23_y1987_s036_d28_1280\x94K6\x8c\x19PENN23_y1996_s043_d0_1280\x94K7\x8c\x1aPENN23_y1996_s043_d28_1280\x94K8\x8c\x19PENN23_y1964_s006_d0_2560\x94K9\x8c\x1aPENN23_y1964_s006_d28_2560\x94K:\x8c\x19PENN23_y1977_s035_d0_2560\x94K;\x8c\x1aPENN23_y1977_s035_d28_2560\x94K<\x8c\x19PENN23_y1987_s036_d0_2560\x94K=\x8c\x1aPENN23_y1987_s036_d28_2560\x94K>\x8c\x19PENN23_y1996_s043_d0_2560\x94K?\x8c\x1aPENN23_y1996_s043_d28_2560\x94K@\x8c\x19PENN23_y1964_s006_d0_5120\x94KA\x8c\x1aPENN23_y1964_s006_d28_5120\x94KB\x8c\x19PENN23_y1977_s035_d0_5120\x94KC\x8c\x1aPENN23_y1977_s035_d28_5120\x94KD\x8c\x19PENN23_y1987_s036_d0_5120\x94KE\x8c\x1aPENN23_y1987_s036_d28_5120\x94KF\x8c\x19PENN23_y1996_s043_d0_5120\x94KG\x8c\x1aPENN23_y1996_s043_d28_5120\x94KH\x8c\x1aPENN23_y1964_s006_d0_10240\x94KI\x8c\x1bPENN23_y1964_s006_d28_10240\x94KJ\x8c\x1aPENN23_y1977_s035_d0_10240\x94KK\x8c\x1bPENN23_y1977_s035_d28_10240\x94KL\x8c\x1aPENN23_y1987_s036_d0_10240\x94KM\x8c\x1bPENN23_y1987_s036_d28_10240\x94KN\x8c\x1aPENN23_y1996_s043_d0_10240\x94KO\x8c\x1bPENN23_y1996_s043_d28_10240\x94KP\x8c\x1aPENN23_y1964_s006_d0_20480\x94KQ\x8c\x1bPENN23_y1964_s006_d28_20480\x94KR\x8c\x1aPENN23_y1977_s035_d0_20480\x94KS\x8c\x1bPENN23_y1977_s035_d28_20480\x94KT\x8c\x1aPENN23_y1987_s036_d0_20480\x94KU\x8c\x1bPENN23_y1987_s036_d28_20480\x94KV\x8c\x1aPENN23_y1996_s043_d0_20480\x94KW\x8c\x1bPENN23_y1996_s043_d28_20480\x94KX\x8c\x1aPENN23_y1964_s006_d0_40960\x94KY\x8c\x1bPENN23_y1964_s006_d28_40960\x94KZ\x8c\x1aPENN23_y1977_s035_d0_40960\x94K[\x8c\x1bPENN23_y1977_s035_d28_40960\x94K\\\x8c\x1aPENN23_y1987_s036_d0_40960\x94K]\x8c\x1bPENN23_y1987_s036_d28_40960\x94K^\x8c\x1aPENN23_y1996_s043_d0_40960\x94K_\x8c\x1bPENN23_y1996_s043_d28_40960\x94u\x8c\x06sample\x94}\x94(K\x00j\x10\x01\x00\x00K\x01j\x11\x01\x00\x00K\x02j\x12\x01\x00\x00K\x03j\x13\x01\x00\x00K\x04j\x14\x01\x00\x00K\x05j\x15\x01\x00\x00K\x06j\x16\x01\x00\x00K\x07j\x17\x01\x00\x00K\x08j\x18\x01\x00\x00K\tj\x19\x01\x00\x00K\nj\x1a\x01\x00\x00K\x0bj\x1b\x01\x00\x00K\x0cj\x1c\x01\x00\x00K\rj\x1d\x01\x00\x00K\x0ej\x1e\x01\x00\x00K\x0fj\x1f\x01\x00\x00K\x10j \x01\x00\x00K\x11j!\x01\x00\x00K\x12j"\x01\x00\x00K\x13j#\x01\x00\x00K\x14j$\x01\x00\x00K\x15j%\x01\x00\x00K\x16j&\x01\x00\x00K\x17j\'\x01\x00\x00K\x18j(\x01\x00\x00K\x19j)\x01\x00\x00K\x1aj*\x01\x00\x00K\x1bj+\x01\x00\x00K\x1cj,\x01\x00\x00K\x1dj-\x01\x00\x00K\x1ej.\x01\x00\x00K\x1fj/\x01\x00\x00K j0\x01\x00\x00K!j1\x01\x00\x00K"j2\x01\x00\x00K#j3\x01\x00\x00K$j4\x01\x00\x00K%j5\x01\x00\x00K&j6\x01\x00\x00K\'j7\x01\x00\x00K(j8\x01\x00\x00K)j9\x01\x00\x00K*j:\x01\x00\x00K+j;\x01\x00\x00K,j<\x01\x00\x00K-j=\x01\x00\x00K.j>\x01\x00\x00K/j?\x01\x00\x00K0j@\x01\x00\x00K1jA\x01\x00\x00K2jB\x01\x00\x00K3jC\x01\x00\x00K4jD\x01\x00\x00K5jE\x01\x00\x00K6jF\x01\x00\x00K7jG\x01\x00\x00K8jH\x01\x00\x00K9jI\x01\x00\x00K:jJ\x01\x00\x00K;jK\x01\x00\x00K<jL\x01\x00\x00K=jM\x01\x00\x00K>jN\x01\x00\x00K?jO\x01\x00\x00K@jP\x01\x00\x00KAjQ\x01\x00\x00KBjR\x01\x00\x00KCjS\x01\x00\x00KDjT\x01\x00\x00KEjU\x01\x00\x00KFjV\x01\x00\x00KGjW\x01\x00\x00KHjX\x01\x00\x00KIjY\x01\x00\x00KJjZ\x01\x00\x00KKj[\x01\x00\x00KLj\\\x01\x00\x00KMj]\x01\x00\x00KNj^\x01\x00\x00KOj_\x01\x00\x00KPj`\x01\x00\x00KQja\x01\x00\x00KRjb\x01\x00\x00KSjc\x01\x00\x00KTjd\x01\x00\x00KUje\x01\x00\x00KVjf\x01\x00\x00KWjg\x01\x00\x00KXjh\x01\x00\x00KYji\x01\x00\x00KZjj\x01\x00\x00K[jk\x01\x00\x00K\\jl\x01\x00\x00K]jm\x01\x00\x00K^jn\x01\x00\x00K_jo\x01\x00\x00u\x8c\x05plate\x94}\x94(K\x00\x8c\x06plate5\x94K\x01j\xf8\x02\x00\x00K\x02j\xf8\x02\x00\x00K\x03j\xf8\x02\x00\x00K\x04j\xf8\x02\x00\x00K\x05j\xf8\x02\x00\x00K\x06j\xf8\x02\x00\x00K\x07j\xf8\x02\x00\x00K\x08j\xf8\x02\x00\x00K\tj\xf8\x02\x00\x00K\nj\xf8\x02\x00\x00K\x0bj\xf8\x02\x00\x00K\x0cj\xf8\x02\x00\x00K\rj\xf8\x02\x00\x00K\x0ej\xf8\x02\x00\x00K\x0fj\xf8\x02\x00\x00K\x10j\xf8\x02\x00\x00K\x11j\xf8\x02\x00\x00K\x12j\xf8\x02\x00\x00K\x13j\xf8\x02\x00\x00K\x14j\xf8\x02\x00\x00K\x15j\xf8\x02\x00\x00K\x16j\xf8\x02\x00\x00K\x17j\xf8\x02\x00\x00K\x18j\xf8\x02\x00\x00K\x19j\xf8\x02\x00\x00K\x1aj\xf8\x02\x00\x00K\x1bj\xf8\x02\x00\x00K\x1cj\xf8\x02\x00\x00K\x1dj\xf8\x02\x00\x00K\x1ej\xf8\x02\x00\x00K\x1fj\xf8\x02\x00\x00K j\xf8\x02\x00\x00K!j\xf8\x02\x00\x00K"j\xf8\x02\x00\x00K#j\xf8\x02\x00\x00K$j\xf8\x02\x00\x00K%j\xf8\x02\x00\x00K&j\xf8\x02\x00\x00K\'j\xf8\x02\x00\x00K(j\xf8\x02\x00\x00K)j\xf8\x02\x00\x00K*j\xf8\x02\x00\x00K+j\xf8\x02\x00\x00K,j\xf8\x02\x00\x00K-j\xf8\x02\x00\x00K.j\xf8\x02\x00\x00K/j\xf8\x02\x00\x00K0j\xf8\x02\x00\x00K1j\xf8\x02\x00\x00K2j\xf8\x02\x00\x00K3j\xf8\x02\x00\x00K4j\xf8\x02\x00\x00K5j\xf8\x02\x00\x00K6j\xf8\x02\x00\x00K7j\xf8\x02\x00\x00K8j\xf8\x02\x00\x00K9j\xf8\x02\x00\x00K:j\xf8\x02\x00\x00K;j\xf8\x02\x00\x00K<j\xf8\x02\x00\x00K=j\xf8\x02\x00\x00K>j\xf8\x02\x00\x00K?j\xf8\x02\x00\x00K@j\xf8\x02\x00\x00KAj\xf8\x02\x00\x00KBj\xf8\x02\x00\x00KCj\xf8\x02\x00\x00KDj\xf8\x02\x00\x00KEj\xf8\x02\x00\x00KFj\xf8\x02\x00\x00KGj\xf8\x02\x00\x00KHj\xf8\x02\x00\x00KIj\xf8\x02\x00\x00KJj\xf8\x02\x00\x00KKj\xf8\x02\x00\x00KLj\xf8\x02\x00\x00KMj\xf8\x02\x00\x00KNj\xf8\x02\x00\x00KOj\xf8\x02\x00\x00KPj\xf8\x02\x00\x00KQj\xf8\x02\x00\x00KRj\xf8\x02\x00\x00KSj\xf8\x02\x00\x00KTj\xf8\x02\x00\x00KUj\xf8\x02\x00\x00KVj\xf8\x02\x00\x00KWj\xf8\x02\x00\x00KXj\xf8\x02\x00\x00KYj\xf8\x02\x00\x00KZj\xf8\x02\x00\x00K[j\xf8\x02\x00\x00K\\j\xf8\x02\x00\x00K]j\xf8\x02\x00\x00K^j\xf8\x02\x00\x00K_j\xf8\x02\x00\x00u\x8c\x0fplate_replicate\x94}\x94(K\x00\x8c\x08plate5-1\x94K\x01\x8c\x08plate5-2\x94K\x02\x8c\x08plate5-3\x94K\x03\x8c\x08plate5-4\x94K\x04\x8c\x08plate5-5\x94K\x05\x8c\x08plate5-6\x94K\x06\x8c\x08plate5-7\x94K\x07\x8c\x08plate5-8\x94K\x08j\xf8\x02\x00\x00K\tj\xf8\x02\x00\x00K\nj\xf8\x02\x00\x00K\x0bj\xf8\x02\x00\x00K\x0cj\xf8\x02\x00\x00K\rj\xf8\x02\x00\x00K\x0ej\xf8\x02\x00\x00K\x0fj\xf8\x02\x00\x00K\x10j\xf8\x02\x00\x00K\x11j\xf8\x02\x00\x00K\x12j\xf8\x02\x00\x00K\x13j\xf8\x02\x00\x00K\x14j\xf8\x02\x00\x00K\x15j\xf8\x02\x00\x00K\x16j\xf8\x02\x00\x00K\x17j\xf8\x02\x00\x00K\x18j\xf8\x02\x00\x00K\x19j\xf8\x02\x00\x00K\x1aj\xf8\x02\x00\x00K\x1bj\xf8\x02\x00\x00K\x1cj\xf8\x02\x00\x00K\x1dj\xf8\x02\x00\x00K\x1ej\xf8\x02\x00\x00K\x1fj\xf8\x02\x00\x00K j\xf8\x02\x00\x00K!j\xf8\x02\x00\x00K"j\xf8\x02\x00\x00K#j\xf8\x02\x00\x00K$j\xf8\x02\x00\x00K%j\xf8\x02\x00\x00K&j\xf8\x02\x00\x00K\'j\xf8\x02\x00\x00K(j\xf8\x02\x00\x00K)j\xf8\x02\x00\x00K*j\xf8\x02\x00\x00K+j\xf8\x02\x00\x00K,j\xf8\x02\x00\x00K-j\xf8\x02\x00\x00K.j\xf8\x02\x00\x00K/j\xf8\x02\x00\x00K0j\xf8\x02\x00\x00K1j\xf8\x02\x00\x00K2j\xf8\x02\x00\x00K3j\xf8\x02\x00\x00K4j\xf8\x02\x00\x00K5j\xf8\x02\x00\x00K6j\xf8\x02\x00\x00K7j\xf8\x02\x00\x00K8j\xf8\x02\x00\x00K9j\xf8\x02\x00\x00K:j\xf8\x02\x00\x00K;j\xf8\x02\x00\x00K<j\xf8\x02\x00\x00K=j\xf8\x02\x00\x00K>j\xf8\x02\x00\x00K?j\xf8\x02\x00\x00K@j\xf8\x02\x00\x00KAj\xf8\x02\x00\x00KBj\xf8\x02\x00\x00KCj\xf8\x02\x00\x00KDj\xf8\x02\x00\x00KEj\xf8\x02\x00\x00KFj\xf8\x02\x00\x00KGj\xf8\x02\x00\x00KHj\xf8\x02\x00\x00KIj\xf8\x02\x00\x00KJj\xf8\x02\x00\x00KKj\xf8\x02\x00\x00KLj\xf8\x02\x00\x00KMj\xf8\x02\x00\x00KNj\xf8\x02\x00\x00KOj\xf8\x02\x00\x00KPj\xf8\x02\x00\x00KQj\xf8\x02\x00\x00KRj\xf8\x02\x00\x00KSj\xf8\x02\x00\x00KTj\xf8\x02\x00\x00KUj\xf8\x02\x00\x00KVj\xf8\x02\x00\x00KWj\xf8\x02\x00\x00KXj\xf8\x02\x00\x00KYj\xf8\x02\x00\x00KZj\xf8\x02\x00\x00K[j\xf8\x02\x00\x00K\\j\xf8\x02\x00\x00K]j\xf8\x02\x00\x00K^j\xf8\x02\x00\x00K_j\xf8\x02\x00\x00uuue}\x94(h\xcd}\x94(j\xb3\x01\x00\x00K\x00N\x86\x94\x8c\x0cplate_params\x94K\x01N\x86\x94uh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbj\xb3\x01\x00\x00j\x0f\x01\x00\x00j\x06\x03\x00\x00jp\x01\x00\x00ub\x8c\twildcards\x94h\x06\x8c\tWildcards\x94\x93\x94)\x81\x94\x8c\x06plate5\x94a}\x94(h\xcd}\x94\x8c\x05plate\x94K\x00N\x86\x94sh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbj\xf6\x02\x00\x00j\x11\x03\x00\x00ub\x8c\x07threads\x94K\x01\x8c\tresources\x94h\x06\x8c\tResources\x94\x93\x94)\x81\x94(K\x01K\x01\x8c\x15/loc/scratch/25903787\x94e}\x94(h\xcd}\x94(\x8c\x06_cores\x94K\x00N\x86\x94\x8c\x06_nodes\x94K\x01N\x86\x94\x8c\x06tmpdir\x94K\x02N\x86\x94uh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbj#\x03\x00\x00K\x01j%\x03\x00\x00K\x01j\'\x03\x00\x00j \x03\x00\x00ub\x8c\x03log\x94h\x06\x8c\x03Log\x94\x93\x94)\x81\x94\x8c*results/plates/plate5/process_plate5.ipynb\x94a}\x94(h\xcd}\x94\x8c\x08notebook\x94K\x00N\x86\x94sh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbj5\x03\x00\x00j2\x03\x00\x00ub\x8c\x06config\x94}\x94(\x8c\x10seqneut-pipeline\x94\x8c\x10seqneut-pipeline\x94\x8c\x04docs\x94\x8c\x04docs\x94\x8c\x0bdescription\x94X\xc2\x01\x00\x00# Sequencing-based neutralization assays of 2023-2024 Penn Vaccine samples versus H1N1 influenza libraries\nStudy by Loes, Tarabi, et al of samples from the Penn Vaccine cohort using sequencing-based neutralization assay developed in the Bloom lab.\n\nThe numerical data and computer code are at [https://github.com/jbloomlab/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts](https://github.com/jbloomlab/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts)\n\x94\x8c\x0fviral_libraries\x94}\x94\x8c\x0epdmH1N1Lib2023\x94\x8c*data/viral_libraries/H1N1_2023_library.csv\x94s\x8c\x12neut_standard_sets\x94}\x94\x8c\x08loes2023\x94\x8c3data/neut_standard_sets/loes2023_neut_standards.csv\x94s\x8c\x17viral_strain_plot_order\x94\x8c\'data/250212_StrainsMatchBalticOrder.csv\x94\x8c\x1eillumina_barcode_parser_params\x94}\x94(j\xa8\x01\x00\x00j\xa9\x01\x00\x00j\xaa\x01\x00\x00j\xab\x01\x00\x00j\xac\x01\x00\x00K\x14j\xad\x01\x00\x00K\x04j\xae\x01\x00\x00j\xaf\x01\x00\x00u\x8c#default_process_plate_qc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c%default_process_plate_curvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00]\x94(G?\xe3333333K\x01ej\x98\x01\x00\x00K\x00j\x99\x01\x00\x00]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c!default_process_plate_curvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(\x8c\x06min_R2\x94G?\xe6ffffff\x8c\x08max_RMSD\x94G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00]\x94j\xa4\x01\x00\x00]\x94u\x8c\x06plates\x94}\x94(\x8c\x06plate1\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94\x8c\x08datetime\x94\x8c\x04date\x94\x93\x94C\x04\x07\xe8\x06\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate5_RT_Penn2.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(\x8c\x06min_R2\x94G?\xe6ffffff\x8c\x08max_RMSD\x94G?\xd0\x00\x00\x00\x00\x00\x00uj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate3\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x06\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate7_RT_Penn4.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x10serum_replicates\x94]\x94(\x8c\x14PENN23_y1985_s015_d0\x94\x8c\x15PENN23_y1985_s015_d28\x94es\x8c\rqc_thresholds\x94}\x94(\x8c\x1bavg_barcode_counts_per_well\x94M\x90\x01\x8c\x1fmin_neut_standard_frac_per_well\x94G?tz\xe1G\xae\x14{\x8c"no_serum_per_viral_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?\x04\xf8\xb5\x88\xe3h\xf1\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c!per_neut_standard_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?*6\xe2\xeb\x1cC-\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c min_neut_standard_count_per_well\x94M\xf4\x01\x8c)min_no_serum_count_per_viral_barcode_well\x94K2\x8c+max_frac_infectivity_per_viral_barcode_well\x94K\x04\x8c)min_dilutions_per_barcode_serum_replicate\x94K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate4\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x06\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate8_RT_Penn5.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uuj\xf8\x02\x00\x00}\x94(jq\x01\x00\x00jr\x01\x00\x00js\x01\x00\x00jh\x03\x00\x00C\x04\x07\xe8\x06\x14\x94\x85\x94R\x94ju\x01\x00\x00jv\x01\x00\x00jw\x01\x00\x00jx\x01\x00\x00jy\x01\x00\x00jz\x01\x00\x00j{\x01\x00\x00}\x94j}\x01\x00\x00]\x94(j\x7f\x01\x00\x00j\x80\x01\x00\x00esj\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05uj\x93\x01\x00\x00}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00uj\x9b\x01\x00\x00}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j\xa0\x01\x00\x00G?\xe6ffffffj\xa1\x01\x00\x00G?\xd0\x00\x00\x00\x00\x00\x00uj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00uj\xa6\x01\x00\x00}\x94(j\xb0\x01\x00\x00j\xb1\x01\x00\x00j\xb2\x01\x00\x00K\x01uu\x8c\x06plate6\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x06\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c data/plates/plate10_RT_Penn8.csv\x94\x8c\x0cmanual_drops\x94}\x94(\x8c\x10serum_replicates\x94]\x94(\x8c\x14PENN23_y1964_s038_d0\x94\x8c\x15PENN23_y1964_s038_d28\x94e\x8c\x05wells\x94]\x94(\x8c\x03A12\x94\x8c\x03B12\x94\x8c\x03C12\x94\x8c\x03D12\x94\x8c\x03E12\x94\x8c\x03F12\x94\x8c\x03G12\x94\x8c\x03H12\x94eu\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate7\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x07\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c data/plates/plate11_RT_Penn9.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate8\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x07\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/plate12_RT_Penn10.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x05wells\x94]\x94\x8c\x03B10\x94as\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(\x8c\x06min_R2\x94G?\xe6ffffff\x8c\x08max_RMSD\x94G?\xd0\x00\x00\x00\x00\x00\x00uj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate9\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x07\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/plate13_RT_Penn11.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate10\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x07\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/plate14_RT_Penn1n2.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate11\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\t\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c data/plates/plate15_PennRep1.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate12\x94}\x94(\x8c\x05group\x94\x8c\x11CellVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\t\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1cdata/plates/plate16_Cell.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x08barcodes\x94}\x94s\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate13\x94}\x94(\x8c\x05group\x94\x8c\x11CellVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\t\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1cdata/plates/plate17_Cell.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate14\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x0c\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate20_DRIVE_plateA.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate15\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x0c\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate20_DRIVE_plateB.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate16\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x0c\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate20_DRIVE_plateC.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate17\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x0c\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate20_DRIVE_plateD.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate18\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x01\x1d\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate24_DRIVE_plateE.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate19\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x01\x1d\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate25_DRIVE_plateF.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate20\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x01\x1d\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate26_DRIVE_plateG.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x08barcodes\x94]\x94\x8c\x10AATCCGAAATTTATTC\x94as\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate21\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x01\x1b\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate27_DRIVE_plateH.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate22\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x03\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate28_DRIVE_plateI.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate23\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x03\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c#data/plates/plate29_Penn_plateI.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate24\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x03\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate30_DRIVE_plateJ.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x83\x01\x00\x00M\xf4\x01j\x84\x01\x00\x00G?tz\xe1G\xae\x14{j\x85\x01\x00\x00}\x94(j\x87\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x88\x01\x00\x00K\x04j\x89\x01\x00\x00K\x02uj\x8a\x01\x00\x00}\x94(j\x8c\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x02uj\x8f\x01\x00\x00M\xf4\x01j\x90\x01\x00\x00K2j\x91\x01\x00\x00K\x04j\x92\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x95\x01\x00\x00K\x01j\x96\x01\x00\x00jV\x03\x00\x00j\x98\x01\x00\x00K\x00j\x99\x01\x00\x00jW\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x9d\x01\x00\x00K\x00j\x9e\x01\x00\x00}\x94(j[\x03\x00\x00G?\xe6ffffffj\\\x03\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\xa2\x01\x00\x00j]\x03\x00\x00j\xa4\x01\x00\x00j^\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uuu\x8c\x14miscellaneous_plates\x94}\x94(\x8c\x12plate1_initialpool\x94}\x94(\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x01\x13\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/plate1_initialpool.csv\x94u\x8c\rplate2_repool\x94}\x94(\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x01\x1a\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c&data/plates/plate2_repoolrepassage.csv\x94u\x8c\x0eplate3_MOITest\x94}\x94(\x8c\x04date\x94jh\x03\x00\x00C\x04\x07\xe8\x02\x1d\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate3_MOItest.csv\x94uu\x8c\x16default_serum_titer_as\x94\x8c\x08midpoint\x94\x8c\x1bdefault_serum_qc_thresholds\x94}\x94(\x8c\x0emin_replicates\x94K\x01\x8c\x1bmax_fold_change_from_median\x94K\n\x8c\x11viruses_ignore_qc\x94}\x94u\x8c\x16sera_override_defaults\x94}\x94u\x8c\x04rule\x94\x8c\rprocess_plate\x94\x8c\x0fbench_iteration\x94N\x8c\tscriptdir\x94\x8c~/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/seqneut-pipeline/notebooks\x94ub.');del script;from snakemake.logging import logger;from snakemake.script import snakemake; logger.printshellcmds = False;import os; os.chdir(r'/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts');
######## snakemake preamble end #########

Process plate counts to get fraction infectivities and fit curves¶

This notebook is designed to be run using snakemake, and analyzes a plate of sequencing-based neutralization assays.

The plots generated by this notebook are interactive, so you can mouseover points for details, use the mouse-scroll to zoom and pan, and use interactive dropdowns at the bottom of the plots.

Setup¶

Import Python modules:

In [2]:
import pickle
import sys

import altair as alt

import matplotlib.pyplot as plt

import neutcurve

import numpy

import pandas as pd

import ruamel.yaml as yaml

_ = alt.data_transformers.disable_max_rows()

Get the variables passed by snakemake:

In [3]:
count_csvs = snakemake.input.count_csvs
fate_csvs = snakemake.input.fate_csvs
viral_library_csv = snakemake.input.viral_library_csv
neut_standard_set_csv = snakemake.input.neut_standard_set_csv
qc_drops_yaml = snakemake.output.qc_drops
frac_infectivity_csv = snakemake.output.frac_infectivity_csv
fits_csv = snakemake.output.fits_csv
fits_pickle = snakemake.output.fits_pickle
samples = snakemake.params.samples
plate = snakemake.wildcards.plate
plate_params = snakemake.params.plate_params

# get thresholds turning lists into tuples as needed
manual_drops = {
    filter_type: [tuple(w) if isinstance(w, list) else w for w in filter_drops]
    for (filter_type, filter_drops) in plate_params["manual_drops"].items()
}
group = plate_params["group"]
qc_thresholds = plate_params["qc_thresholds"]
curvefit_params = plate_params["curvefit_params"]
curvefit_qc = plate_params["curvefit_qc"]
curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"] = [
    tuple(w) for w in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
]

print(f"Processing {plate=}")

samples_df = pd.DataFrame(plate_params["samples"])
print(f"\nPlate has {len(samples)} samples (wells)")
assert all(
    (len(samples_df) == samples_df[c].nunique())
    for c in ["well", "sample", "sample_noplate"]
)
assert len(samples_df) == len(
    samples_df.groupby(["serum_replicate", "dilution_factor"])
)
assert len(samples) == len(count_csvs) == len(fate_csvs) == len(samples_df)

for d, key, title in [
    (manual_drops, "manual_drops", "Data manually specified to drop:"),
    (qc_thresholds, "qc_thresholds", "QC thresholds applied to data:"),
    (curvefit_params, "curvefit_params", "Curve-fitting parameters:"),
    (curvefit_qc, "curvefit_qc", "Curve-fitting QC:"),
]:
    print(f"\n{title}")
    yaml.YAML(typ="rt").dump({key: d}, stream=sys.stdout)
Processing plate='plate5'

Plate has 96 samples (wells)

Data manually specified to drop:
manual_drops:
  serum_replicates:
  - PENN23_y1964_s006_d0
  - PENN23_y1964_s006_d28
QC thresholds applied to data:
qc_thresholds:
  avg_barcode_counts_per_well: 500
  min_neut_standard_frac_per_well: 0.005
  no_serum_per_viral_barcode_filters:
    min_frac: 4e-05
    max_fold_change: 4
    max_wells: 2
  per_neut_standard_barcode_filters:
    min_frac: 0.0002
    max_fold_change: 4
    max_wells: 2
  min_neut_standard_count_per_well: 500
  min_no_serum_count_per_viral_barcode_well: 50
  max_frac_infectivity_per_viral_barcode_well: 4
  min_dilutions_per_barcode_serum_replicate: 5
Curve-fitting parameters:
curvefit_params:
  frac_infectivity_ceiling: 1
  fixtop:
  - 0.6
  - 1
  fixbottom: 0
  fixslope:
  - 0.8
  - 10
Curve-fitting QC:
curvefit_qc:
  max_frac_infectivity_at_least: 0
  goodness_of_fit:
    min_R2: 0.7
    max_RMSD: 0.25
  serum_replicates_ignore_curvefit_qc: []
  barcode_serum_replicates_ignore_curvefit_qc: []

Set up dictionary to keep track of wells, barcodes, well-barcodes, and serum-replicates that are dropped:

In [4]:
qc_drops = {
    "wells": {},
    "barcodes": {},
    "barcode_wells": {},
    "barcode_serum_replicates": {},
    "serum_replicates": {},
}

assert set(manual_drops).issubset(
    qc_drops
), f"{manual_drops.keys()=}, {qc_drops.keys()}"

Statistics on barcode-parsing for each sample¶

Make interactive chart of the "fates" of the sequencing reads parsed for each sample on the plate.

If most sequencing reads are not "valid barcodes", this could potentially indicate some problem in the sequencing or barcode set you are parsing.

Potential fates are:

  • valid barcode: barcode that matches a known virus or neutralization standard, we hope most reads are this.
  • invalid barcode: a barcode with proper flanking sequences, but does not match a known virus or neutralization standard. If you have a lot of reads of this type, it is probably a good idea to look at the invalid barcode CSVs (in the ./results/barcode_invalid/ subdirectory created by the pipeline) to see what these invalid barcodes are.
  • unparseable barcode: could not parse a barcode from this read as there was not a sequence of the correct length with the appropriate flanking sequence.
  • invalid outer flank: if using an outer upstream or downstream region (upstream2 or downstream2 for the illuminabarcodeparser), reads that are otherwise valid except for this outer flank. Typically you would be using upstream2 if you have a plate index embedded in your primer, and reads with this classification correspond to a different index than the one for this plate.
  • low quality barcode: low-quality or N nucleotides in barcode, could indicate problem with sequencing.
  • failed chastity filter: reads that failed the Illumina chastity filter, if these are reported in the FASTQ (they may not be).

Also, if the number of reads per sample is very uneven, that could indicate that you did not do a good job of balancing the different samples in the Illumina sequencing.

In [5]:
fates = (
    pd.concat([pd.read_csv(f).assign(sample=s) for f, s in zip(fate_csvs, samples)])
    .merge(samples_df, validate="many_to_one", on="sample")
    .assign(
        fate_counts=lambda x: x.groupby("fate")["count"].transform("sum"),
        sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")",
    )
    .query("fate_counts > 0")[  # only keep fates with at least one count
        ["fate", "count", "well", "serum_replicate", "sample_well", "dilution_factor"]
    ]
)

assert len(fates) == len(fates.drop_duplicates())

serum_replicates = sorted(fates["serum_replicate"].unique())
sample_wells = list(
    fates.sort_values(["serum_replicate", "dilution_factor"])["sample_well"]
)


serum_selection = alt.selection_point(
    fields=["serum_replicate"],
    bind=alt.binding_select(
        options=[None] + serum_replicates,
        labels=["all"] + serum_replicates,
        name="serum",
    ),
)

fates_chart = (
    alt.Chart(fates)
    .add_params(serum_selection)
    .transform_filter(serum_selection)
    .encode(
        alt.X("count", scale=alt.Scale(nice=False, padding=3)),
        alt.Y(
            "sample_well",
            title=None,
            sort=sample_wells,
        ),
        alt.Color("fate", sort=sorted(fates["fate"].unique(), reverse=True)),
        alt.Order("fate", sort="descending"),
        tooltip=fates.columns.tolist(),
    )
    .mark_bar(height={"band": 0.85})
    .properties(
        height=alt.Step(10),
        width=200,
        title=f"Barcode parsing for {plate}",
    )
    .configure_axis(grid=False)
)

fates_chart
Out[5]:

Read barcode counts and apply manually specified drops¶

Read the counts per barcode:

In [6]:
# get barcode counts
counts = (
    pd.concat([pd.read_csv(c).assign(sample=s) for c, s in zip(count_csvs, samples)])
    .merge(samples_df, validate="many_to_one", on="sample")
    .drop(columns=["replicate", "plate", "fastq"])
    .assign(sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")")
)

# classify barcodes as viral or neut standard
barcode_class = pd.concat(
    [
        pd.read_csv(viral_library_csv)[["barcode", "strain"]].assign(
            neut_standard=False,
        ),
        pd.read_csv(neut_standard_set_csv)[["barcode"]].assign(
            neut_standard=True,
            strain=pd.NA,
        ),
    ],
    ignore_index=True,
)

# merge counts and classification of barcodes
assert set(counts["barcode"]) == set(barcode_class["barcode"])
counts = counts.merge(barcode_class, on="barcode", validate="many_to_one")
assert set(sample_wells) == set(counts["sample_well"])
assert set(serum_replicates) == set(counts["serum_replicate"])

Apply any manually specified data drops:

In [7]:
for filter_type, filter_drops in manual_drops.items():
    print(f"\nDropping {len(filter_drops)} {filter_type} specified in manual_drops")
    assert filter_type in qc_drops
    qc_drops[filter_type].update(
        {w: "manual_drop" for w in filter_drops if not isinstance(w, list)}
    )
    if filter_type == "barcode_wells":
        counts = counts[
            ~counts.assign(
                barcode_well=lambda x: x.apply(
                    lambda r: (r["barcode"], r["well"]), axis=1
                )
            )["barcode_well"].isin(qc_drops[filter_type])
        ]
    elif filter_type == "barcode_serum_replicates":
        counts = counts[
            ~counts.assign(
                barcode_serum_replicate=lambda x: x.apply(
                    lambda r: (r["barcode"], r["serum_replicate"]), axis=1
                )
            )["barcode_serum_replicate"].isin(qc_drops[filter_type])
        ]
    elif filter_type == "wells":
        counts = counts[~counts["well"].isin(qc_drops[filter_type])]
    elif filter_type == "barcodes":
        counts = counts[~counts["barcode"].isin(qc_drops[filter_type])]
    elif filter_type == "serum_replicates":
        counts = counts[~counts["serum_replicate"].isin(qc_drops[filter_type])]
    elif filter_type == "barcode_serum_replicates":
        counts = counts[~counts["barcode_serum_replicate"].isin(qc_drops[filter_type])]
    else:
        assert filter_type in set(counts.columns)
        counts = counts[~counts[filter_type].isin(qc_drops[filter_type])]
Dropping 2 serum_replicates specified in manual_drops

Average counts per barcode in each well¶

Plot average counts per barcode. If a sample has inadequate barcode counts, it may not have good enough statistics for accurate analysis, and a QC-threshold is applied:

In [8]:
avg_barcode_counts = (
    counts.groupby(
        ["well", "serum_replicate", "sample_well"],
        dropna=False,
        as_index=False,
    )
    .aggregate(avg_count=pd.NamedAgg("count", "mean"))
    .assign(
        fails_qc=lambda x: (
            x["avg_count"] < qc_thresholds["avg_barcode_counts_per_well"]
        ),
    )
)

avg_barcode_counts_chart = (
    alt.Chart(avg_barcode_counts)
    .add_params(serum_selection)
    .transform_filter(serum_selection)
    .encode(
        alt.X(
            "avg_count",
            title="average barcode counts per well",
            scale=alt.Scale(nice=False, padding=3),
        ),
        alt.Y("sample_well", sort=sample_wells),
        alt.Color(
            "fails_qc",
            title=f"fails {qc_thresholds['avg_barcode_counts_per_well']=}",
            legend=alt.Legend(titleLimit=500),
        ),
        tooltip=[
            alt.Tooltip(c, format=".3g") if avg_barcode_counts[c].dtype == float else c
            for c in avg_barcode_counts.columns
        ],
    )
    .mark_bar(height={"band": 0.85})
    .properties(
        height=alt.Step(10),
        width=250,
        title=f"Average barcode counts per well for {plate}",
    )
    .configure_axis(grid=False)
)

display(avg_barcode_counts_chart)

# drop wells failing QC
avg_barcode_counts_per_well_drops = list(avg_barcode_counts.query("fails_qc")["well"])
print(
    f"\nDropping {len(avg_barcode_counts_per_well_drops)} wells for failing "
    f"{qc_thresholds['avg_barcode_counts_per_well']=}: "
    + str(avg_barcode_counts_per_well_drops)
)
qc_drops["wells"].update(
    {w: "avg_barcode_counts_per_well" for w in avg_barcode_counts_per_well_drops}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 2 wells for failing qc_thresholds['avg_barcode_counts_per_well']=500: ['C1', 'D1']

Fraction of counts from neutralization standard¶

Determine the fraction of counts from the neutralization standard in each sample, and make sure this fraction passess the QC threshold.

In [9]:
neut_standard_fracs = (
    counts.assign(
        neut_standard_count=lambda x: x["count"] * x["neut_standard"].astype(int)
    )
    .groupby(
        ["well", "serum_replicate", "sample_well"],
        dropna=False,
        as_index=False,
    )
    .aggregate(
        total_count=pd.NamedAgg("count", "sum"),
        neut_standard_count=pd.NamedAgg("neut_standard_count", "sum"),
    )
    .assign(
        neut_standard_frac=lambda x: x["neut_standard_count"] / x["total_count"],
        fails_qc=lambda x: (
            x["neut_standard_frac"] < qc_thresholds["min_neut_standard_frac_per_well"]
        ),
    )
)

neut_standard_fracs_chart = (
    alt.Chart(neut_standard_fracs)
    .add_params(serum_selection)
    .transform_filter(serum_selection)
    .encode(
        alt.X(
            "neut_standard_frac",
            title="frac counts from neutralization standard per well",
            scale=alt.Scale(nice=False, padding=3),
        ),
        alt.Y("sample_well", sort=sample_wells),
        alt.Color(
            "fails_qc",
            title=f"fails {qc_thresholds['min_neut_standard_frac_per_well']=}",
            legend=alt.Legend(titleLimit=500),
        ),
        tooltip=[
            alt.Tooltip(c, format=".3g") if neut_standard_fracs[c].dtype == float else c
            for c in neut_standard_fracs.columns
        ],
    )
    .mark_bar(height={"band": 0.85})
    .properties(
        height=alt.Step(10),
        width=250,
        title=f"Neutralization-standard fracs per well for {plate}",
    )
    .configure_axis(grid=False)
    .configure_legend(titleLimit=1000)
)

display(neut_standard_fracs_chart)

# drop wells failing QC
min_neut_standard_frac_per_well_drops = list(
    neut_standard_fracs.query("fails_qc")["well"]
)
print(
    f"\nDropping {len(min_neut_standard_frac_per_well_drops)} wells for failing "
    f"{qc_thresholds['min_neut_standard_frac_per_well']=}: "
    + str(min_neut_standard_frac_per_well_drops)
)
qc_drops["wells"].update(
    {
        w: "min_neut_standard_frac_per_well"
        for w in min_neut_standard_frac_per_well_drops
    }
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_frac_per_well']=0.005: []

Consistency and minimum fractions for barcodes¶

We examine the fraction of counts attributable to each barcode. We do this splitting the data two ways:

  1. Looking at all viral (but not neut-standard) barcodes only for the no-serum samples (wells).

  2. Looking at just the neut-standard barcodes for all samples (wells).

The reasons is that if the experiment is set up perfectly, these fractions should be the same across all samples for each barcode. (We do not expect viral barcodes to have consistent fractions across no-serum samples as they will be neutralized differently depending on strain).

We plot these fractions in interactive plots (you can mouseover points and zoom) so you can identify barcodes that fail the expected consistency QC thresholds.

We also make sure the barcodes meet specified QC minimum thresholds for all samples, and flag any that do not.

In [10]:
barcode_selection = alt.selection_point(fields=["barcode"], on="mouseover", empty=False)

# look at all samples for neut standard barcodes, or no-serum samples for all barcodes
for is_neut_standard, df in counts.groupby("neut_standard"):
    if is_neut_standard:
        print(
            f"\n\n{'=' * 89}\nAnalyzing neut-standard barcodes from all samples (wells)"
        )
        qc_name = "per_neut_standard_barcode_filters"
    else:
        print(f"\n\n{'=' * 89}\nAnalyzing all barcodes from no-serum samples (wells)")
        qc_name = "no_serum_per_viral_barcode_filters"
        df = df.query("serum == 'none'")

    df = df.assign(
        sample_counts=lambda x: x.groupby("sample")["count"].transform("sum"),
        count_frac=lambda x: x["count"] / x["sample_counts"],
        median_count_frac=lambda x: x.groupby("barcode")["count_frac"].transform(
            "median"
        ),
        fold_change_from_median=lambda x: numpy.where(
            x["count_frac"] > x["median_count_frac"],
            x["count_frac"] / x["median_count_frac"],
            x["median_count_frac"] / x["count_frac"],
        ),
    )[
        [
            "barcode",
            "count",
            "well",
            "sample_well",
            "count_frac",
            "median_count_frac",
            "fold_change_from_median",
        ]
        + ([] if is_neut_standard else ["strain"])
    ]

    # barcode fails QC if fails in sufficient wells
    qc = qc_thresholds[qc_name]
    print(f"Apply QC {qc_name}: {qc}\n")
    fails_qc = (
        df.assign(
            fails_qc=lambda x: ~(
                (x["count_frac"] >= qc["min_frac"])
                & (x["fold_change_from_median"] <= qc["max_fold_change"])
            ),
        )
        .groupby("barcode", as_index=False)
        .aggregate(n_wells_fail_qc=pd.NamedAgg("fails_qc", "sum"))
        .assign(fails_qc=lambda x: x["n_wells_fail_qc"] >= qc["max_wells"])[
            ["barcode", "fails_qc"]
        ]
    )
    df = df.merge(fails_qc, on="barcode", validate="many_to_one")

    # make chart
    evenness_chart = (
        alt.Chart(df)
        .add_params(barcode_selection)
        .encode(
            alt.X(
                "count_frac",
                title=(
                    "barcode's fraction of neut standard counts"
                    if is_neut_standard
                    else "barcode's fraction of non-neut standard counts"
                ),
                scale=alt.Scale(nice=False, padding=5),
            ),
            alt.Y("sample_well", sort=sample_wells),
            alt.Fill(
                "fails_qc",
                title=f"fails {qc_name}",
                legend=alt.Legend(titleLimit=500),
            ),
            strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
            size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
            tooltip=[
                alt.Tooltip(c, format=".2g") if df[c].dtype == float else c
                for c in df.columns
            ],
        )
        .mark_circle(fillOpacity=0.45, stroke="black", strokeOpacity=1)
        .properties(
            height=alt.Step(10),
            width=300,
            title=alt.TitleParams(
                (
                    f"{plate} all samples, neut-standard barcodes"
                    if is_neut_standard
                    else f"{plate} no-serum samples, all barcodes"
                ),
                subtitle="x-axis is zoomable (use mouse scroll/pan)",
            ),
        )
        .configure_axis(grid=False)
        .configure_legend(titleLimit=1000)
        .interactive()
    )

    display(evenness_chart)

    # drop barcodes failing QC
    barcode_drops = list(fails_qc.query("fails_qc")["barcode"])
    print(
        f"\nDropping {len(barcode_drops)} barcodes for failing {qc=}: {barcode_drops}"
    )
    qc_drops["barcodes"].update(
        {bc: "min_neut_standard_frac_per_well" for bc in barcode_drops}
    )
    counts = counts[~counts["barcode"].isin(qc_drops["barcodes"])]

=========================================================================================
Analyzing all barcodes from no-serum samples (wells)
Apply QC no_serum_per_viral_barcode_filters: {'min_frac': 4e-05, 'max_fold_change': 4, 'max_wells': 2}

Dropping 4 barcodes for failing qc={'min_frac': 4e-05, 'max_fold_change': 4, 'max_wells': 2}: ['CCAGGAACAATATATC', 'CCCACCCCTGCCTCCC', 'GAGCAGTATCTGGTTA', 'TTGAAAGCCACAACAC']


=========================================================================================
Analyzing neut-standard barcodes from all samples (wells)
Apply QC per_neut_standard_barcode_filters: {'min_frac': 0.0002, 'max_fold_change': 4, 'max_wells': 2}

Dropping 0 barcodes for failing qc={'min_frac': 0.0002, 'max_fold_change': 4, 'max_wells': 2}: []

Compute fraction infectivity¶

The fraction infectivity for viral barcode $v_b$ in sample $s$ is computed as: $$ F_{v_b,s} = \frac{c_{v_b,s} / \left(\sum_{n_b} c_{n_b,s}\right)}{{\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]} $$ where

  • $c_{v_b,s}$ is the counts of viral barcode $v_b$ in sample $s$.
  • $\sum_{n_b} c_{n_b,s}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for sample $s$.
  • $c_{v_b,s_0}$ is the counts of viral barcode $v_b$ in no-serum sample $s_0$.
  • $\sum_{n_b} c_{n_b,s_0}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for no-serum sample $s_0$.
  • ${\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]$ is the median taken across all no-serum samples of the counts of viral barcode $v_b$ versus the total counts for all neutralization standard barcodes.

First, compute the total neutralization-standard counts for each sample (well). Plot these, and drop any wells that do not meet the QC threshold.

In [11]:
neut_standard_counts = (
    counts.query("neut_standard")
    .groupby(
        ["well", "serum_replicate", "sample_well", "dilution_factor"],
        dropna=False,
        as_index=False,
    )
    .aggregate(neut_standard_count=pd.NamedAgg("count", "sum"))
    .assign(
        fails_qc=lambda x: (
            x["neut_standard_count"] < qc_thresholds["min_neut_standard_count_per_well"]
        ),
    )
)

neut_standard_counts_chart = (
    alt.Chart(neut_standard_counts)
    .add_params(serum_selection)
    .transform_filter(serum_selection)
    .encode(
        alt.X(
            "neut_standard_count",
            title="counts from neutralization standard",
            scale=alt.Scale(nice=False, padding=3),
        ),
        alt.Y("sample_well", sort=sample_wells),
        alt.Color(
            "fails_qc",
            title=f"fails {qc_thresholds['min_neut_standard_count_per_well']=}",
            legend=alt.Legend(titleLimit=500),
        ),
        tooltip=[
            (
                alt.Tooltip(c, format=".3g")
                if neut_standard_counts[c].dtype == float
                else c
            )
            for c in neut_standard_counts.columns
        ],
    )
    .mark_bar(height={"band": 0.85})
    .properties(
        height=alt.Step(10),
        width=250,
        title=f"Neutralization-standard counts for {plate}",
    )
    .configure_axis(grid=False)
    .configure_legend(titleLimit=1000)
)

display(neut_standard_counts_chart)

# drop wells failing QC
min_neut_standard_count_per_well_drops = list(
    neut_standard_counts.query("fails_qc")["well"]
)
print(
    f"\nDropping {len(min_neut_standard_count_per_well_drops)} wells for failing "
    f"{qc_thresholds['min_neut_standard_count_per_well']=}: "
    + str(min_neut_standard_count_per_well_drops)
)
qc_drops["wells"].update(
    {
        w: "min_neut_standard_count_per_well"
        for w in min_neut_standard_count_per_well_drops
    }
)
neut_standard_counts = neut_standard_counts[
    ~neut_standard_counts["well"].isin(qc_drops["wells"])
]
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_count_per_well']=500: []

Compute and plot the no-serum sample viral barcode counts and check if they pass the QC filters.

In [12]:
no_serum_counts = (
    counts.query("serum == 'none'")
    .query("not neut_standard")
    .merge(neut_standard_counts, validate="many_to_one")[
        ["barcode", "strain", "well", "sample_well", "count", "neut_standard_count"]
    ]
    .assign(
        fails_qc=lambda x: (
            x["count"] <= qc_thresholds["min_no_serum_count_per_viral_barcode_well"]
        ),
    )
)

strains = sorted(no_serum_counts["strain"].unique())
strain_selection_dropdown = alt.selection_point(
    fields=["strain"],
    bind=alt.binding_select(
        options=[None] + strains,
        labels=["all"] + strains,
        name="virus strain",
    ),
)

# make chart
no_serum_counts_chart = (
    alt.Chart(no_serum_counts)
    .add_params(barcode_selection, strain_selection_dropdown)
    .transform_filter(strain_selection_dropdown)
    .encode(
        alt.X(
            "count", title="viral barcode count", scale=alt.Scale(nice=False, padding=5)
        ),
        alt.Y("sample_well", sort=sample_wells),
        alt.Fill(
            "fails_qc",
            title=f"fails {qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}",
            legend=alt.Legend(titleLimit=500),
        ),
        strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
        size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
        tooltip=no_serum_counts.columns.tolist(),
    )
    .mark_circle(fillOpacity=0.6, stroke="black", strokeOpacity=1)
    .properties(
        height=alt.Step(10),
        width=400,
        title=f"{plate} viral barcode counts in no-serum samples",
    )
    .configure_axis(grid=False)
    .configure_legend(titleLimit=1000)
    .interactive()
)

display(no_serum_counts_chart)

# drop barcode / wells failing QC
min_no_serum_count_per_viral_barcode_well_drops = list(
    no_serum_counts.query("fails_qc")[["barcode", "well"]].itertuples(
        index=False, name=None
    )
)
print(
    f"\nDropping {len(min_no_serum_count_per_viral_barcode_well_drops)} barcode-wells for failing "
    f"{qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}: "
    + str(min_no_serum_count_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
    {
        w: "min_no_serum_count_per_viral_barcode_well"
        for w in min_no_serum_count_per_viral_barcode_well_drops
    }
)
no_serum_counts = no_serum_counts[
    ~no_serum_counts.assign(
        barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
    )["barcode_well"].isin(qc_drops["barcode_wells"])
]
counts = counts[
    ~counts.assign(
        barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
    )["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 0 barcode-wells for failing qc_thresholds['min_no_serum_count_per_viral_barcode_well']=50: []

Compute and plot the median ratio of viral barcode count to neut standard counts across no-serum samples. If library composition is equal, all of these values should be similar:

In [13]:
median_no_serum_ratio = (
    no_serum_counts.assign(ratio=lambda x: x["count"] / x["neut_standard_count"])
    .groupby(["barcode", "strain"], as_index=False)
    .aggregate(median_no_serum_ratio=pd.NamedAgg("ratio", "median"))
)

strain_selection = alt.selection_point(fields=["strain"], on="mouseover", empty=False)

median_no_serum_ratio_chart = (
    alt.Chart(median_no_serum_ratio)
    .add_params(strain_selection)
    .encode(
        alt.X(
            "median_no_serum_ratio",
            title="median ratio of counts",
            scale=alt.Scale(nice=False, padding=5),
        ),
        alt.Y(
            "barcode",
            sort=alt.SortField("median_no_serum_ratio", order="descending"),
            axis=alt.Axis(labelFontSize=5),
        ),
        color=alt.condition(strain_selection, alt.value("orange"), alt.value("gray")),
        tooltip=[
            (
                alt.Tooltip(c, format=".3g")
                if median_no_serum_ratio[c].dtype == float
                else c
            )
            for c in median_no_serum_ratio.columns
        ],
    )
    .mark_bar(height={"band": 0.85})
    .properties(
        height=alt.Step(5),
        width=250,
        title=f"{plate} no-serum median ratio viral barcode to neut-standard barcode",
    )
    .configure_axis(grid=False)
    .configure_legend(titleLimit=1000)
)

display(median_no_serum_ratio_chart)

Compute the actual fraction infectivities. We compute both the raw fraction infectivities and the ones with the ceiling applied:

In [14]:
frac_infectivity = (
    counts.query("not neut_standard")
    .query("serum != 'none'")
    .merge(median_no_serum_ratio, validate="many_to_one")
    .merge(neut_standard_counts, validate="many_to_one")
    .assign(
        frac_infectivity_raw=lambda x: (
            (x["count"] / x["neut_standard_count"]) / x["median_no_serum_ratio"]
        ),
        frac_infectivity_ceiling=lambda x: x["frac_infectivity_raw"].clip(
            upper=curvefit_params["frac_infectivity_ceiling"]
        ),
        concentration=lambda x: 1 / x["dilution_factor"],
        plate_barcode=lambda x: x["plate_replicate"] + "-" + x["barcode"],
    )[
        [
            "barcode",
            "plate_barcode",
            "well",
            "strain",
            "serum",
            "serum_replicate",
            "dilution_factor",
            "concentration",
            "frac_infectivity_raw",
            "frac_infectivity_ceiling",
        ]
    ]
)

assert len(
    frac_infectivity.groupby(["serum", "plate_barcode", "dilution_factor"])
) == len(frac_infectivity)
assert frac_infectivity["dilution_factor"].notnull().all()
assert frac_infectivity["frac_infectivity_raw"].notnull().all()
assert frac_infectivity["frac_infectivity_ceiling"].notnull().all()

Plot the fraction infectivities, both the raw values and with the ceiling applied:

In [15]:
frac_infectivity_chart_df = (
    frac_infectivity.assign(
        fails_qc=lambda x: (
            x["frac_infectivity_raw"]
            > qc_thresholds["max_frac_infectivity_per_viral_barcode_well"]
        ),
    )
    .melt(
        id_vars=[
            "barcode",
            "strain",
            "well",
            "serum_replicate",
            "dilution_factor",
            "fails_qc",
        ],
        value_vars=["frac_infectivity_raw", "frac_infectivity_ceiling"],
        var_name="ceiling_applied",
        value_name="frac_infectivity",
    )
    .assign(
        ceiling_applied=lambda x: x["ceiling_applied"].map(
            {
                "frac_infectivity_raw": "raw fraction infectivity",
                "frac_infectivity_ceiling": f"fraction infectivity with ceiling at {curvefit_params['frac_infectivity_ceiling']}",
            }
        )
    )
)

frac_infectivity_chart = (
    alt.Chart(frac_infectivity_chart_df)
    .add_params(strain_selection_dropdown, barcode_selection)
    .transform_filter(strain_selection_dropdown)
    .encode(
        alt.X(
            "dilution_factor",
            title="dilution factor",
            scale=alt.Scale(nice=False, padding=5, type="log"),
        ),
        alt.Y(
            "frac_infectivity",
            title="fraction infectivity",
            scale=alt.Scale(nice=False, padding=5),
        ),
        alt.Column(
            "ceiling_applied",
            sort="descending",
            title=None,
            header=alt.Header(labelFontSize=13, labelFontStyle="bold", labelPadding=2),
        ),
        alt.Row(
            "serum_replicate",
            title=None,
            spacing=3,
            header=alt.Header(labelFontSize=13, labelFontStyle="bold"),
        ),
        alt.Detail("barcode"),
        alt.Shape(
            "fails_qc",
            title=f"fails {qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}",
            legend=alt.Legend(titleLimit=500, orient="bottom"),
        ),
        color=alt.condition(
            barcode_selection, alt.value("black"), alt.value("MediumBlue")
        ),
        strokeWidth=alt.condition(barcode_selection, alt.value(3), alt.value(1)),
        opacity=alt.condition(barcode_selection, alt.value(1), alt.value(0.25)),
        tooltip=[
            (
                alt.Tooltip(c, format=".3g")
                if frac_infectivity_chart_df[c].dtype == float
                else c
            )
            for c in frac_infectivity_chart_df.columns
        ],
    )
    .mark_line(point=True)
    .properties(
        height=150,
        width=250,
        title=f"Fraction infectivities for {plate}",
    )
    .interactive(bind_x=False)
    .configure_axis(grid=False)
    .configure_legend(titleLimit=1000)
    .configure_point(size=50)
    .resolve_scale(x="independent", y="independent")
)

display(frac_infectivity_chart)

# drop barcode / wells failing QC
max_frac_infectivity_per_viral_barcode_well_drops = list(
    frac_infectivity_chart_df.query("fails_qc")[["barcode", "well"]]
    .drop_duplicates()
    .itertuples(index=False, name=None)
)
print(
    f"\nDropping {len(max_frac_infectivity_per_viral_barcode_well_drops)} barcode-wells for failing "
    f"{qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}: "
    + str(max_frac_infectivity_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
    {
        w: "max_frac_infectivity_per_viral_barcode_well"
        for w in max_frac_infectivity_per_viral_barcode_well_drops
    }
)
frac_infectivity = frac_infectivity[
    ~frac_infectivity.assign(
        barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
    )["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 120 barcode-wells for failing qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=4: [('TCGACGCTTCATGGAA', 'B3'), ('TAACAGTTAGACAAAA', 'B3'), ('GTAAAGACCTTCGGAG', 'B3'), ('ACTAAAGGCATAGTAG', 'B3'), ('ACTTATGCTCTTGATA', 'B3'), ('ACAAATAGTTTATAGA', 'B3'), ('ATATGTGCTAACAAAA', 'B3'), ('TGGGAAATCATTGGTA', 'B3'), ('ATTACCTAAGTGAAAT', 'B3'), ('TATGACATTAGAAACA', 'B3'), ('TAGGACTACAGAGAAC', 'B3'), ('ACGTAAAAAGGATATC', 'B3'), ('ATTGTGAAGAATTGCT', 'B3'), ('GGCTTGAATGATATTG', 'B3'), ('AGAAAGCTGTTAATAC', 'B3'), ('ACAGTCGCAGGGAATA', 'B3'), ('TGTGATAGACCTAGAA', 'B3'), ('ACTTAAAATCTTATAA', 'B3'), ('ACTTAGGAAGGTAAAC', 'B3'), ('CTCCTAATAAAAAACT', 'B3'), ('TAGTAATCTAAAGTAA', 'B3'), ('TTCTATAGTACTTCTA', 'B3'), ('GGATTGTAATAAATCA', 'B3'), ('ACGGCAAGTGATGAAA', 'B3'), ('GTTTCTGCCTTACAAA', 'B3'), ('GTATCCCCACGAAAGT', 'B3'), ('TACTAAGTAAGAGCAA', 'B3'), ('ACCTATTCTATTTTTC', 'B3'), ('TGAACTAGACTTTCAA', 'B3'), ('AATAAAATGCATGGGT', 'B3'), ('TCTATCATCGCCGTTA', 'B3'), ('AAACTGATTAATGATG', 'B3'), ('AGTCAGGAGTCATATA', 'B3'), ('AAAGCTCTTTTCGTTC', 'B3'), ('AAATTAAAGAGGTTAA', 'B3'), ('GTCCACAACAGTTGAA', 'B3'), ('AGGAAAGAAACTGGAG', 'B3'), ('CAGATATGAGAGAGCA', 'B3'), ('TAACCGCTTCAATATA', 'B3'), ('AAGATTACCAAATTAT', 'B3'), ('AAAATGCTGGGGTATA', 'B3'), ('CGTTAAGTTGAAAAAA', 'B3'), ('TGTTTTACATTAGATG', 'B3'), ('AAAGCCCTAGTTAAGT', 'B3'), ('CAAAAACTTTAATTTC', 'B3'), ('ACTACCGCTAATATGC', 'B3'), ('TGAAGCCATGAGTATC', 'B3'), ('AGTACTTCGTACTCCT', 'B3'), ('CTGAACTTGTCGATAT', 'B3'), ('TGGCCTGCTTCGGAAA', 'B3'), ('CGATGCACTCGTAAGT', 'B3'), ('ATACGTATTGATATCT', 'B3'), ('AAATAATGAGTTTATA', 'B3'), ('TCCGAAAGACCAAAAC', 'B3'), ('GTCAAATAAATTTTCA', 'B3'), ('ACCCCTTCAGAAGTTA', 'B3'), ('CCATAACTGTATATGG', 'B3'), ('ATCCCATCAACAAAAT', 'B3'), ('GCATCCTTTTCCTGTT', 'B3'), ('AATTGTGAATGCCACA', 'B3'), ('TAGTTGACTGTCGAGG', 'B3'), ('AATCCATTAGTTCAGC', 'B3'), ('CCACATAGGCGTTTTT', 'B3'), ('GAATATAAATGGGCAT', 'B3'), ('GAATATAAATGGGCAT', 'F4'), ('GTAAAGACCTTCGGAG', 'D4'), ('CGAAAGAACCTACCCG', 'D4'), ('ATTACCTAAGTGAAAT', 'D4'), ('TGAACTAGACTTTCAA', 'D4'), ('AGAAAGCTGTTAATAC', 'D4'), ('ATACGTATTGATATCT', 'D4'), ('TAGTAATCTAAAGTAA', 'D4'), ('TGGGAAATCATTGGTA', 'D4'), ('AAAGTGAGACCTGTAC', 'D4'), ('TAGGACTACAGAGAAC', 'D4'), ('TGAAGCCATGAGTATC', 'D4'), ('ACTAAAGGCATAGTAG', 'D4'), ('TATGGCCTATAGGTTC', 'D4'), ('AATAAAATGCATGGGT', 'D4'), ('TGTGATAGACCTAGAA', 'D4'), ('GACAATATACCCCCAT', 'D4'), ('GTATCCCCACGAAAGT', 'D4'), ('GGCTTGAATGATATTG', 'D4'), ('CTGAACTTGTCGATAT', 'D4'), ('ACCCCTTCAGAAGTTA', 'D4'), ('AGGAAAGAAACTGGAG', 'D4'), ('AGCATCACGTCAGTCT', 'D4'), ('GAAAATGATCCACATT', 'D4'), ('AGTCAGGAGTCATATA', 'D4'), ('TATGACATTAGAAACA', 'D4'), ('TCTATCATCGCCGTTA', 'D4'), ('AAAGCTCTTTTCGTTC', 'D4'), ('TGGCCTGCTTCGGAAA', 'D4'), ('AAATAATGAGTTTATA', 'D4'), ('CCAGCCACATAAAATT', 'D4'), ('AATTGTGAATGCCACA', 'D4'), ('GTCAAATAAATTTTCA', 'D4'), ('AATCCATTAGTTCAGC', 'D4'), ('GGATTGTAATAAATCA', 'D4'), ('TCCGAAAGACCAAAAC', 'D4'), ('AATGATAACTTAAAAA', 'D4'), ('CGTTAAGTTGAAAAAA', 'D4'), ('GCATCCTTTTCCTGTT', 'D4'), ('ATACGTATTGATATCT', 'F5'), ('AATTGTGAATGCCACA', 'F5'), ('ACTAAAGGCATAGTAG', 'D5'), ('GACAATATACCCCCAT', 'D5'), ('GGCTTGAATGATATTG', 'D5'), ('AAAGCTCTTTTCGTTC', 'D5'), ('TGAAGCCATGAGTATC', 'D5'), ('AATTGTGAATGCCACA', 'D5'), ('CCACATAGGCGTTTTT', 'D5'), ('GAATATAAATGGGCAT', 'D5'), ('TCCGAAAGACCAAAAC', 'C5'), ('ATACGTATTGATATCT', 'E6'), ('AATTGTGAATGCCACA', 'C6'), ('ATACGTATTGATATCT', 'E8'), ('TGGACACTTACAACAA', 'E8'), ('GAATATAAATGGGCAT', 'C8'), ('GAATATAAATGGGCAT', 'C11')]

Check how many dilutions we have per barcode / serum-replicate:

In [16]:
n_dilutions = (
    frac_infectivity.groupby(["serum_replicate", "strain", "barcode"], as_index=False)
    .aggregate(**{"number of dilutions": pd.NamedAgg("dilution_factor", "nunique")})
    .assign(
        fails_qc=lambda x: (
            x["number of dilutions"]
            < qc_thresholds["min_dilutions_per_barcode_serum_replicate"]
        ),
    )
)

n_dilutions_chart = (
    alt.Chart(n_dilutions)
    .add_params(barcode_selection)
    .encode(
        alt.X("number of dilutions", scale=alt.Scale(nice=False, padding=4)),
        alt.Y("strain", title=None),
        alt.Column(
            "serum_replicate",
            title=None,
            header=alt.Header(labelFontSize=12, labelFontStyle="bold", labelPadding=0),
        ),
        alt.Fill(
            "fails_qc",
            title=f"fails {qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}",
            legend=alt.Legend(titleLimit=500, orient="bottom"),
        ),
        strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
        size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
        tooltip=[
            alt.Tooltip(c, format=".3g") if n_dilutions[c].dtype == float else c
            for c in n_dilutions.columns
        ],
    )
    .mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.45)
    .properties(
        height=alt.Step(10),
        width=120,
        title=alt.TitleParams(
            "number of dilutions for each barcode for each serum-replicate", dy=-2
        ),
    )
)

display(n_dilutions_chart)

# drop barcode / serum-replicates failing QC
min_dilutions_per_barcode_serum_replicate_drops = list(
    n_dilutions.query("fails_qc")[["barcode", "serum_replicate"]].itertuples(
        index=False, name=None
    )
)
print(
    f"\nDropping {len(min_dilutions_per_barcode_serum_replicate_drops)} barcode/serum-replicates for failing "
    f"{qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}: "
    + str(min_dilutions_per_barcode_serum_replicate_drops)
)
qc_drops["barcode_serum_replicates"].update(
    {
        w: "min_dilutions_per_barcode_serum_replicate"
        for w in min_dilutions_per_barcode_serum_replicate_drops
    }
)
frac_infectivity = frac_infectivity[
    ~frac_infectivity.assign(
        barcode_serum_replicate=lambda x: x.apply(
            lambda r: (r["barcode"], r["serum_replicate"]), axis=1
        )
    )["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Dropping 0 barcode/serum-replicates for failing qc_thresholds['min_dilutions_per_barcode_serum_replicate']=5: []

Fit neutralization curves without applying QC to curves¶

First fit curves to all serum replicates, then we will apply QC on the curve fits. Note that the fitting is done to the fraction infectivities with the ceiling:

In [17]:
fits_noqc = neutcurve.CurveFits(
    frac_infectivity.rename(
        columns={
            "frac_infectivity_ceiling": "fraction infectivity",
            "concentration": "serum concentration",
        }
    ),
    conc_col="serum concentration",
    fracinf_col="fraction infectivity",
    virus_col="strain",
    serum_col="serum_replicate",
    replicate_col="barcode",
    fixtop=curvefit_params["fixtop"],
    fixbottom=curvefit_params["fixbottom"],
    fixslope=curvefit_params["fixslope"],
)

Determine which fits fail the curve fitting QC, and plot them. Note the plot indicates as failing QC any barcode / serum-replicate that fails, even if we are also specified to ignore the QC for that one (so it will not be removed later):

In [18]:
goodness_of_fit = curvefit_qc["goodness_of_fit"]

fit_params_noqc = (
    frac_infectivity.groupby(["serum_replicate", "barcode"], as_index=False)
    .aggregate(max_frac_infectivity=pd.NamedAgg("frac_infectivity_ceiling", "max"))
    .merge(
        fits_noqc.fitParams(average_only=False, no_average=True)[
            ["serum", "virus", "replicate", "r2", "rmsd"]
        ].rename(columns={"serum": "serum_replicate", "replicate": "barcode"}),
        validate="one_to_one",
    )
    .assign(
        fails_max_frac_infectivity_at_least=lambda x: (
            x["max_frac_infectivity"] < curvefit_qc["max_frac_infectivity_at_least"]
        ),
        fails_goodness_of_fit=lambda x: (
            (x["r2"] < goodness_of_fit["min_R2"])
            & (x["rmsd"] > goodness_of_fit["max_RMSD"])
        ),
        fails_qc=lambda x: (
            x["fails_max_frac_infectivity_at_least"] | x["fails_goodness_of_fit"]
        ),
        ignore_qc=lambda x: x.apply(
            lambda r: (
                (
                    r["serum_replicate"]
                    in curvefit_qc["serum_replicates_ignore_curvefit_qc"]
                )
                or (
                    (r["barcode"], r["serum_replicate"])
                    in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
                )
            ),
            axis=1,
        ),
    )
)

print(f"Plotting barcode / serum-replicates that fail {curvefit_qc=}\n")

for prop, col in [
    ("max frac infectivity", "max_frac_infectivity"),
    ("curve fit R2", "r2"),
    ("curve fit RMSD", "rmsd"),
]:
    fit_params_noqc_chart = (
        alt.Chart(fit_params_noqc)
        .add_params(barcode_selection)
        .encode(
            alt.X(col, title=prop, scale=alt.Scale(nice=False, padding=4)),
            alt.Y("virus", title=None),
            alt.Fill("fails_qc"),
            alt.Column(
                "serum_replicate",
                title=None,
                header=alt.Header(
                    labelFontSize=12, labelFontStyle="bold", labelPadding=0
                ),
            ),
            strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
            size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
            tooltip=[
                alt.Tooltip(c, format=".3g") if fit_params_noqc[c].dtype == float else c
                for c in fit_params_noqc.columns
            ],
        )
        .mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.55)
        .properties(
            height=alt.Step(10),
            width=120,
            title=alt.TitleParams(f"{prop} for each barcode serum-replicate", dy=-2),
        )
    )
    display(fit_params_noqc_chart)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: divide by zero encountered in divide
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: divide by zero encountered in divide
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: divide by zero encountered in divide
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:469: UserWarning: `f` increases with concentration, consider `infectivity_or_neutralized="neutralized"
  warnings.warn(
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:469: UserWarning: `f` increases with concentration, consider `infectivity_or_neutralized="neutralized"
  warnings.warn(
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
Plotting barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0, 'goodness_of_fit': {'min_R2': 0.7, 'max_RMSD': 0.25}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}

Now get all barcode / serum-replicate pairs that fail any of the QC. Plot curves for just these virus / serum-replicates (we plot all barcodes for a virus even if just one fails QC), and then exclude any that are not specified to ignore the QC:

In [19]:
barcode_serum_replicates_fail_qc = fit_params_noqc.query("fails_qc").reset_index(
    drop=True
)
print(f"Here are barcode / serum-replicates that fail {curvefit_qc=}")
display(barcode_serum_replicates_fail_qc)

if len(barcode_serum_replicates_fail_qc):
    print("\nCurves for viruses and serum-replicates with at least one failed barcode:")
    fig, _ = fits_noqc.plotReplicates(
        sera=sorted(barcode_serum_replicates_fail_qc["serum_replicate"].unique()),
        viruses=sorted(barcode_serum_replicates_fail_qc["virus"].unique()),
        attempt_shared_legend=False,
        legendfontsize=8,
        titlesize=10,
        ticksize=10,
        ncol=6,
        draw_in_bounds=True,
    )
    display(fig)
    plt.close(fig)

# drop barcode / serum-replicates failing QC
for qc_filter in ["max_frac_infectivity_at_least", "goodness_of_fit"]:
    fits_qc_drops = list(
        fit_params_noqc.query(f"fails_{qc_filter} and (not ignore_qc)")[
            ["barcode", "serum_replicate"]
        ].itertuples(index=False, name=None)
    )
    print(
        f"\nDropping {len(fits_qc_drops)} barcode/serum-replicates for failing "
        f"{qc_filter}={curvefit_qc[qc_filter]}: " + str(fits_qc_drops)
    )
    qc_drops["barcode_serum_replicates"].update({w: qc_filter for w in fits_qc_drops})
    frac_infectivity = frac_infectivity[
        ~frac_infectivity.assign(
            barcode_serum_replicate=lambda x: x.apply(
                lambda r: (r["barcode"], r["serum_replicate"]), axis=1
            )
        )["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
    ]
    fit_params_noqc = fit_params_noqc[
        ~fit_params_noqc.assign(
            barcode_serum_replicate=lambda x: x.apply(
                lambda r: (r["barcode"], r["serum_replicate"]), axis=1
            )
        )["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
    ]
Here are barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0, 'goodness_of_fit': {'min_R2': 0.7, 'max_RMSD': 0.25}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
serum_replicate barcode max_frac_infectivity virus r2 rmsd fails_max_frac_infectivity_at_least fails_goodness_of_fit fails_qc ignore_qc
0 PENN23_y1977_s035_d0 AAATAATGAGTTTATA 1.0 A/Pennsylvania/46/2023 5.299679e-01 0.251627 False True True False
1 PENN23_y1977_s035_d0 AATGATAACTTAAAAA 1.0 A/ChiangRai/P3437/2023 4.650626e-01 0.263823 False True True False
2 PENN23_y1977_s035_d0 AGGAAAGAAACTGGAG 1.0 A/Wisconsin/67/2022 4.696094e-01 0.270349 False True True False
3 PENN23_y1977_s035_d0 CCCGACAAAGCCCTCG 1.0 A/Thies/1247/2023 5.412502e-01 0.271216 False True True False
4 PENN23_y1977_s035_d0 TTCTATAGTACTTCTA 1.0 A/Michigan/MISAPPHIREL365374393/2023 4.679131e-01 0.264730 False True True False
5 PENN23_y1987_s036_d0 GCATCCTTTTCCTGTT 1.0 A/Victoria/1834/2023 6.304404e-01 0.252237 False True True False
6 PENN23_y1987_s036_d0 TTCTATAGTACTTCTA 1.0 A/Michigan/MISAPPHIREL365374393/2023 5.862837e-01 0.252797 False True True False
7 PENN23_y1996_s043_d0 AAAATGCTGGGGTATA 1.0 A/Victoria/1013/2023 4.118020e-01 0.252468 False True True False
8 PENN23_y1996_s043_d0 AAGATTACCAAATTAT 1.0 A/Victoria/1389/2023 2.276624e-01 0.260064 False True True False
9 PENN23_y1996_s043_d0 ACGGCAAGTGATGAAA 1.0 A/RioGrandedoSul/6798/2023 1.393763e-01 0.264709 False True True False
10 PENN23_y1996_s043_d0 AGCCCGAAGAGCCCCT 1.0 A/California/75/2023 8.867382e-02 0.257812 False True True False
11 PENN23_y1996_s043_d0 ATAGCATGCGATTTTA 1.0 A/Cambodia/SVH230198/2023 1.642596e-01 0.252355 False True True False
12 PENN23_y1996_s043_d0 ATTGTGAAGAATTGCT 1.0 A/Oregon/32/2023 3.785636e-01 0.260460 False True True False
13 PENN23_y1996_s043_d0 CAGTCGCATTGAACCT 1.0 A/Victoria/1013/2023 2.356368e-01 0.264953 False True True False
14 PENN23_y1996_s043_d0 CCCCAACCTATCGTAA 1.0 A/Singapore/GP7085/2023 2.663562e-01 0.251144 False True True False
15 PENN23_y1996_s043_d0 CCCGACAAAGCCCTCG 1.0 A/Thies/1247/2023 3.620878e-01 0.263632 False True True False
16 PENN23_y1996_s043_d0 CTCCTAATAAAAAACT 1.0 A/Victoria/1384/2023 2.643957e-01 0.258929 False True True False
17 PENN23_y1996_s043_d0 GAATATAAATGGGCAT 1.0 A/Sydney/845/2023 -2.220446e-16 0.270269 False True True False
18 PENN23_y1996_s043_d0 GGCTTGAATGATATTG 1.0 A/Gwangju/1254/2023 7.611533e-02 0.271905 False True True False
19 PENN23_y1996_s043_d0 GTCATATTCGATTACA 1.0 A/Jeonbuk/1544/2023 1.502097e-01 0.261033 False True True False
20 PENN23_y1996_s043_d0 GTCCACAACAGTTGAA 1.0 A/Perth/275/2023 2.044297e-01 0.253286 False True True False
Curves for viruses and serum-replicates with at least one failed barcode:
No description has been provided for this image
Dropping 0 barcode/serum-replicates for failing max_frac_infectivity_at_least=0: []

Dropping 21 barcode/serum-replicates for failing goodness_of_fit={'min_R2': 0.7, 'max_RMSD': 0.25}: [('AAATAATGAGTTTATA', 'PENN23_y1977_s035_d0'), ('AATGATAACTTAAAAA', 'PENN23_y1977_s035_d0'), ('AGGAAAGAAACTGGAG', 'PENN23_y1977_s035_d0'), ('CCCGACAAAGCCCTCG', 'PENN23_y1977_s035_d0'), ('TTCTATAGTACTTCTA', 'PENN23_y1977_s035_d0'), ('GCATCCTTTTCCTGTT', 'PENN23_y1987_s036_d0'), ('TTCTATAGTACTTCTA', 'PENN23_y1987_s036_d0'), ('AAAATGCTGGGGTATA', 'PENN23_y1996_s043_d0'), ('AAGATTACCAAATTAT', 'PENN23_y1996_s043_d0'), ('ACGGCAAGTGATGAAA', 'PENN23_y1996_s043_d0'), ('AGCCCGAAGAGCCCCT', 'PENN23_y1996_s043_d0'), ('ATAGCATGCGATTTTA', 'PENN23_y1996_s043_d0'), ('ATTGTGAAGAATTGCT', 'PENN23_y1996_s043_d0'), ('CAGTCGCATTGAACCT', 'PENN23_y1996_s043_d0'), ('CCCCAACCTATCGTAA', 'PENN23_y1996_s043_d0'), ('CCCGACAAAGCCCTCG', 'PENN23_y1996_s043_d0'), ('CTCCTAATAAAAAACT', 'PENN23_y1996_s043_d0'), ('GAATATAAATGGGCAT', 'PENN23_y1996_s043_d0'), ('GGCTTGAATGATATTG', 'PENN23_y1996_s043_d0'), ('GTCATATTCGATTACA', 'PENN23_y1996_s043_d0'), ('GTCCACAACAGTTGAA', 'PENN23_y1996_s043_d0')]

Fit neutralization curves after applying QC¶

No we re-fit curves after applying all the QC:

In [20]:
fits_qc = neutcurve.CurveFits(
    frac_infectivity.rename(
        columns={
            "frac_infectivity_ceiling": "fraction infectivity",
            "concentration": "serum concentration",
        }
    ),
    conc_col="serum concentration",
    fracinf_col="fraction infectivity",
    virus_col="strain",
    serum_col="serum",
    replicate_col="plate_barcode",
    fixtop=curvefit_params["fixtop"],
    fixbottom=curvefit_params["fixbottom"],
    fixslope=curvefit_params["fixslope"],
)

fit_params_qc = fits_qc.fitParams(average_only=False, no_average=True)
assert len(fit_params_qc) <= len(
    fits_noqc.fitParams(average_only=False, no_average=True)
)

print(f"Assigning fits for this plate to {group}")
fit_params_qc.insert(0, "group", group)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: divide by zero encountered in divide
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: divide by zero encountered in divide
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: divide by zero encountered in divide
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:469: UserWarning: `f` increases with concentration, consider `infectivity_or_neutralized="neutralized"
  warnings.warn(
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power
  return b + (t - b) / (1 + (c / m) ** s)
Assigning fits for this plate to PennVaccineCohort

Plot all the curves that passed QC:

In [21]:
if fits_qc.sera:
    _ = fits_qc.plotReplicates(
        attempt_shared_legend=False,
        legendfontsize=8,
        titlesize=10,
        ticksize=10,
        ncol=6,
        draw_in_bounds=True,
    )
else:
    print("No sera passed QC.")
No description has been provided for this image

Save results to files¶

In [22]:
print(f"Writing fraction infectivities to {frac_infectivity_csv}")
(
    frac_infectivity[
        [
            "serum",
            "strain",
            "plate_barcode",
            "dilution_factor",
            "frac_infectivity_raw",
            "frac_infectivity_ceiling",
        ]
    ]
    .sort_values(["serum", "plate_barcode", "dilution_factor"])
    .to_csv(frac_infectivity_csv, index=False, float_format="%.4g")
)

print(f"\nWriting fit parameters to {fits_csv}")
(
    fit_params_qc.drop(columns=["nreplicates", "ic50_str"]).to_csv(
        fits_csv, index=False, float_format="%.4g"
    )
)

print(f"\nPickling neutcurve.CurveFits object for these data to {fits_pickle}")
with open(fits_pickle, "wb") as f:
    pickle.dump(fits_qc, f)

print(f"\nWriting QC drops to {qc_drops_yaml}")


def tup_to_str(x):
    return " ".join(x) if isinstance(x, tuple) else x


qc_drops_for_yaml = {
    key: {tup_to_str(key2): val2 for key2, val2 in val.items()}
    for key, val in qc_drops.items()
}
with open(qc_drops_yaml, "w") as f:
    yaml.YAML(typ="rt").dump(qc_drops_for_yaml, f)
print("\nHere are the QC drops:\n***************************")
yaml.YAML(typ="rt").dump(qc_drops_for_yaml, sys.stdout)
Writing fraction infectivities to results/plates/plate5/frac_infectivity.csv

Writing fit parameters to results/plates/plate5/curvefits.csv

Pickling neutcurve.CurveFits object for these data to results/plates/plate5/curvefits.pickle
Writing QC drops to results/plates/plate5/qc_drops.yml

Here are the QC drops:
***************************
wells:
  C1: avg_barcode_counts_per_well
  D1: avg_barcode_counts_per_well
barcodes:
  CCAGGAACAATATATC: min_neut_standard_frac_per_well
  CCCACCCCTGCCTCCC: min_neut_standard_frac_per_well
  GAGCAGTATCTGGTTA: min_neut_standard_frac_per_well
  TTGAAAGCCACAACAC: min_neut_standard_frac_per_well
barcode_wells:
  TCGACGCTTCATGGAA B3: max_frac_infectivity_per_viral_barcode_well
  TAACAGTTAGACAAAA B3: max_frac_infectivity_per_viral_barcode_well
  GTAAAGACCTTCGGAG B3: max_frac_infectivity_per_viral_barcode_well
  ACTAAAGGCATAGTAG B3: max_frac_infectivity_per_viral_barcode_well
  ACTTATGCTCTTGATA B3: max_frac_infectivity_per_viral_barcode_well
  ACAAATAGTTTATAGA B3: max_frac_infectivity_per_viral_barcode_well
  ATATGTGCTAACAAAA B3: max_frac_infectivity_per_viral_barcode_well
  TGGGAAATCATTGGTA B3: max_frac_infectivity_per_viral_barcode_well
  ATTACCTAAGTGAAAT B3: max_frac_infectivity_per_viral_barcode_well
  TATGACATTAGAAACA B3: max_frac_infectivity_per_viral_barcode_well
  TAGGACTACAGAGAAC B3: max_frac_infectivity_per_viral_barcode_well
  ACGTAAAAAGGATATC B3: max_frac_infectivity_per_viral_barcode_well
  ATTGTGAAGAATTGCT B3: max_frac_infectivity_per_viral_barcode_well
  GGCTTGAATGATATTG B3: max_frac_infectivity_per_viral_barcode_well
  AGAAAGCTGTTAATAC B3: max_frac_infectivity_per_viral_barcode_well
  ACAGTCGCAGGGAATA B3: max_frac_infectivity_per_viral_barcode_well
  TGTGATAGACCTAGAA B3: max_frac_infectivity_per_viral_barcode_well
  ACTTAAAATCTTATAA B3: max_frac_infectivity_per_viral_barcode_well
  ACTTAGGAAGGTAAAC B3: max_frac_infectivity_per_viral_barcode_well
  CTCCTAATAAAAAACT B3: max_frac_infectivity_per_viral_barcode_well
  TAGTAATCTAAAGTAA B3: max_frac_infectivity_per_viral_barcode_well
  TTCTATAGTACTTCTA B3: max_frac_infectivity_per_viral_barcode_well
  GGATTGTAATAAATCA B3: max_frac_infectivity_per_viral_barcode_well
  ACGGCAAGTGATGAAA B3: max_frac_infectivity_per_viral_barcode_well
  GTTTCTGCCTTACAAA B3: max_frac_infectivity_per_viral_barcode_well
  GTATCCCCACGAAAGT B3: max_frac_infectivity_per_viral_barcode_well
  TACTAAGTAAGAGCAA B3: max_frac_infectivity_per_viral_barcode_well
  ACCTATTCTATTTTTC B3: max_frac_infectivity_per_viral_barcode_well
  TGAACTAGACTTTCAA B3: max_frac_infectivity_per_viral_barcode_well
  AATAAAATGCATGGGT B3: max_frac_infectivity_per_viral_barcode_well
  TCTATCATCGCCGTTA B3: max_frac_infectivity_per_viral_barcode_well
  AAACTGATTAATGATG B3: max_frac_infectivity_per_viral_barcode_well
  AGTCAGGAGTCATATA B3: max_frac_infectivity_per_viral_barcode_well
  AAAGCTCTTTTCGTTC B3: max_frac_infectivity_per_viral_barcode_well
  AAATTAAAGAGGTTAA B3: max_frac_infectivity_per_viral_barcode_well
  GTCCACAACAGTTGAA B3: max_frac_infectivity_per_viral_barcode_well
  AGGAAAGAAACTGGAG B3: max_frac_infectivity_per_viral_barcode_well
  CAGATATGAGAGAGCA B3: max_frac_infectivity_per_viral_barcode_well
  TAACCGCTTCAATATA B3: max_frac_infectivity_per_viral_barcode_well
  AAGATTACCAAATTAT B3: max_frac_infectivity_per_viral_barcode_well
  AAAATGCTGGGGTATA B3: max_frac_infectivity_per_viral_barcode_well
  CGTTAAGTTGAAAAAA B3: max_frac_infectivity_per_viral_barcode_well
  TGTTTTACATTAGATG B3: max_frac_infectivity_per_viral_barcode_well
  AAAGCCCTAGTTAAGT B3: max_frac_infectivity_per_viral_barcode_well
  CAAAAACTTTAATTTC B3: max_frac_infectivity_per_viral_barcode_well
  ACTACCGCTAATATGC B3: max_frac_infectivity_per_viral_barcode_well
  TGAAGCCATGAGTATC B3: max_frac_infectivity_per_viral_barcode_well
  AGTACTTCGTACTCCT B3: max_frac_infectivity_per_viral_barcode_well
  CTGAACTTGTCGATAT B3: max_frac_infectivity_per_viral_barcode_well
  TGGCCTGCTTCGGAAA B3: max_frac_infectivity_per_viral_barcode_well
  CGATGCACTCGTAAGT B3: max_frac_infectivity_per_viral_barcode_well
  ATACGTATTGATATCT B3: max_frac_infectivity_per_viral_barcode_well
  AAATAATGAGTTTATA B3: max_frac_infectivity_per_viral_barcode_well
  TCCGAAAGACCAAAAC B3: max_frac_infectivity_per_viral_barcode_well
  GTCAAATAAATTTTCA B3: max_frac_infectivity_per_viral_barcode_well
  ACCCCTTCAGAAGTTA B3: max_frac_infectivity_per_viral_barcode_well
  CCATAACTGTATATGG B3: max_frac_infectivity_per_viral_barcode_well
  ATCCCATCAACAAAAT B3: max_frac_infectivity_per_viral_barcode_well
  GCATCCTTTTCCTGTT B3: max_frac_infectivity_per_viral_barcode_well
  AATTGTGAATGCCACA B3: max_frac_infectivity_per_viral_barcode_well
  TAGTTGACTGTCGAGG B3: max_frac_infectivity_per_viral_barcode_well
  AATCCATTAGTTCAGC B3: max_frac_infectivity_per_viral_barcode_well
  CCACATAGGCGTTTTT B3: max_frac_infectivity_per_viral_barcode_well
  GAATATAAATGGGCAT B3: max_frac_infectivity_per_viral_barcode_well
  GAATATAAATGGGCAT F4: max_frac_infectivity_per_viral_barcode_well
  GTAAAGACCTTCGGAG D4: max_frac_infectivity_per_viral_barcode_well
  CGAAAGAACCTACCCG D4: max_frac_infectivity_per_viral_barcode_well
  ATTACCTAAGTGAAAT D4: max_frac_infectivity_per_viral_barcode_well
  TGAACTAGACTTTCAA D4: max_frac_infectivity_per_viral_barcode_well
  AGAAAGCTGTTAATAC D4: max_frac_infectivity_per_viral_barcode_well
  ATACGTATTGATATCT D4: max_frac_infectivity_per_viral_barcode_well
  TAGTAATCTAAAGTAA D4: max_frac_infectivity_per_viral_barcode_well
  TGGGAAATCATTGGTA D4: max_frac_infectivity_per_viral_barcode_well
  AAAGTGAGACCTGTAC D4: max_frac_infectivity_per_viral_barcode_well
  TAGGACTACAGAGAAC D4: max_frac_infectivity_per_viral_barcode_well
  TGAAGCCATGAGTATC D4: max_frac_infectivity_per_viral_barcode_well
  ACTAAAGGCATAGTAG D4: max_frac_infectivity_per_viral_barcode_well
  TATGGCCTATAGGTTC D4: max_frac_infectivity_per_viral_barcode_well
  AATAAAATGCATGGGT D4: max_frac_infectivity_per_viral_barcode_well
  TGTGATAGACCTAGAA D4: max_frac_infectivity_per_viral_barcode_well
  GACAATATACCCCCAT D4: max_frac_infectivity_per_viral_barcode_well
  GTATCCCCACGAAAGT D4: max_frac_infectivity_per_viral_barcode_well
  GGCTTGAATGATATTG D4: max_frac_infectivity_per_viral_barcode_well
  CTGAACTTGTCGATAT D4: max_frac_infectivity_per_viral_barcode_well
  ACCCCTTCAGAAGTTA D4: max_frac_infectivity_per_viral_barcode_well
  AGGAAAGAAACTGGAG D4: max_frac_infectivity_per_viral_barcode_well
  AGCATCACGTCAGTCT D4: max_frac_infectivity_per_viral_barcode_well
  GAAAATGATCCACATT D4: max_frac_infectivity_per_viral_barcode_well
  AGTCAGGAGTCATATA D4: max_frac_infectivity_per_viral_barcode_well
  TATGACATTAGAAACA D4: max_frac_infectivity_per_viral_barcode_well
  TCTATCATCGCCGTTA D4: max_frac_infectivity_per_viral_barcode_well
  AAAGCTCTTTTCGTTC D4: max_frac_infectivity_per_viral_barcode_well
  TGGCCTGCTTCGGAAA D4: max_frac_infectivity_per_viral_barcode_well
  AAATAATGAGTTTATA D4: max_frac_infectivity_per_viral_barcode_well
  CCAGCCACATAAAATT D4: max_frac_infectivity_per_viral_barcode_well
  AATTGTGAATGCCACA D4: max_frac_infectivity_per_viral_barcode_well
  GTCAAATAAATTTTCA D4: max_frac_infectivity_per_viral_barcode_well
  AATCCATTAGTTCAGC D4: max_frac_infectivity_per_viral_barcode_well
  GGATTGTAATAAATCA D4: max_frac_infectivity_per_viral_barcode_well
  TCCGAAAGACCAAAAC D4: max_frac_infectivity_per_viral_barcode_well
  AATGATAACTTAAAAA D4: max_frac_infectivity_per_viral_barcode_well
  CGTTAAGTTGAAAAAA D4: max_frac_infectivity_per_viral_barcode_well
  GCATCCTTTTCCTGTT D4: max_frac_infectivity_per_viral_barcode_well
  ATACGTATTGATATCT F5: max_frac_infectivity_per_viral_barcode_well
  AATTGTGAATGCCACA F5: max_frac_infectivity_per_viral_barcode_well
  ACTAAAGGCATAGTAG D5: max_frac_infectivity_per_viral_barcode_well
  GACAATATACCCCCAT D5: max_frac_infectivity_per_viral_barcode_well
  GGCTTGAATGATATTG D5: max_frac_infectivity_per_viral_barcode_well
  AAAGCTCTTTTCGTTC D5: max_frac_infectivity_per_viral_barcode_well
  TGAAGCCATGAGTATC D5: max_frac_infectivity_per_viral_barcode_well
  AATTGTGAATGCCACA D5: max_frac_infectivity_per_viral_barcode_well
  CCACATAGGCGTTTTT D5: max_frac_infectivity_per_viral_barcode_well
  GAATATAAATGGGCAT D5: max_frac_infectivity_per_viral_barcode_well
  TCCGAAAGACCAAAAC C5: max_frac_infectivity_per_viral_barcode_well
  ATACGTATTGATATCT E6: max_frac_infectivity_per_viral_barcode_well
  AATTGTGAATGCCACA C6: max_frac_infectivity_per_viral_barcode_well
  ATACGTATTGATATCT E8: max_frac_infectivity_per_viral_barcode_well
  TGGACACTTACAACAA E8: max_frac_infectivity_per_viral_barcode_well
  GAATATAAATGGGCAT C8: max_frac_infectivity_per_viral_barcode_well
  GAATATAAATGGGCAT C11: max_frac_infectivity_per_viral_barcode_well
barcode_serum_replicates:
  AAATAATGAGTTTATA PENN23_y1977_s035_d0: goodness_of_fit
  AATGATAACTTAAAAA PENN23_y1977_s035_d0: goodness_of_fit
  AGGAAAGAAACTGGAG PENN23_y1977_s035_d0: goodness_of_fit
  CCCGACAAAGCCCTCG PENN23_y1977_s035_d0: goodness_of_fit
  TTCTATAGTACTTCTA PENN23_y1977_s035_d0: goodness_of_fit
  GCATCCTTTTCCTGTT PENN23_y1987_s036_d0: goodness_of_fit
  TTCTATAGTACTTCTA PENN23_y1987_s036_d0: goodness_of_fit
  AAAATGCTGGGGTATA PENN23_y1996_s043_d0: goodness_of_fit
  AAGATTACCAAATTAT PENN23_y1996_s043_d0: goodness_of_fit
  ACGGCAAGTGATGAAA PENN23_y1996_s043_d0: goodness_of_fit
  AGCCCGAAGAGCCCCT PENN23_y1996_s043_d0: goodness_of_fit
  ATAGCATGCGATTTTA PENN23_y1996_s043_d0: goodness_of_fit
  ATTGTGAAGAATTGCT PENN23_y1996_s043_d0: goodness_of_fit
  CAGTCGCATTGAACCT PENN23_y1996_s043_d0: goodness_of_fit
  CCCCAACCTATCGTAA PENN23_y1996_s043_d0: goodness_of_fit
  CCCGACAAAGCCCTCG PENN23_y1996_s043_d0: goodness_of_fit
  CTCCTAATAAAAAACT PENN23_y1996_s043_d0: goodness_of_fit
  GAATATAAATGGGCAT PENN23_y1996_s043_d0: goodness_of_fit
  GGCTTGAATGATATTG PENN23_y1996_s043_d0: goodness_of_fit
  GTCATATTCGATTACA PENN23_y1996_s043_d0: goodness_of_fit
  GTCCACAACAGTTGAA PENN23_y1996_s043_d0: goodness_of_fit
serum_replicates:
  PENN23_y1964_s006_d0: manual_drop
  PENN23_y1964_s006_d28: manual_drop